Datenbankoptimierung · Microsoft SQL Server · sehr große Datenbanken

Datenbankoptimierung für SQL Server: Vorgehen, Praxisfälle, Messwerte

Seit mehr als 30 Jahren arbeite ich mit relationalen Datenbanken – von Nachtläufen im Mittelstand bis zu Datenbanken im Milliarden- und Terabyte-Bereich in der Halbleiterproduktion bei NXP. Auf dieser Seite stehen Vorgehen, Praxisfälle und Messungen aus meinem SQL-Labor, jeweils mit Weg zu den Rohdaten.

Performance-Check anfragen Direkt zu den Messwerten

Für Entscheider · das Wichtigste in Kürze
  • Bevorzugte Prüfstrategie: Index vor Code vor Hardware. Im Labor machte ein passender Index eine Abfrage auf 10 Mio. Zeilen ×358 schneller; ein Server mit 8 statt 2 Kernen und zehnfachem Speicher brachte ohne Index nur Faktor 1,7 (100 Mio. Zeilen). Rechnung ansehen
  • Meist sind es wenige Ursachen: fehlende oder falsche Indizes, Datentyp-Konflikte, Ad-hoc-SQL, Sperrketten in Nachtläufen. Die sechs häufigsten
  • Gewachsene Prozeduren lassen sich sicher sanieren: Abhängigkeiten vorab sichtbar, aufgezeichnete Fälle per Prüfsumme gegen den Altcode getestet. Vorgehen
  • Einstieg ohne großes Risiko: Im Performance-Check sehen Sie die Wirkung an Ihrem eigenen System, bevor Sie über mehr entscheiden. Ablauf und Lieferumfang
30+ Jahre

SQL in der Praxis

Datenbankentwicklung, Performance-Tuning und Datenmodellierung in Konzern-IT, Produktion, FDA-regulierten Medizinstudien und Mittelstand – Schwerpunkt MS SQL Server (T-SQL, SSIS, SSRS) sowie Oracle (PL/SQL), MySQL, PostgreSQL und Redis.

64 Mrd. Zeilen · 4 TB

VLDB & Halbleiterproduktion

Bei NXP Semiconductors wurden monatlich rund 1,4 Mrd. neue Seriennummern in Echtzeit gegen 64 Mrd. Bestandszeilen (4 TB) auf Duplikate geprüft – über Insert-only-Tabellen, entkoppelte Redis-Queues, verteilte Satelliten-Datenbanken und unterbrechungsfreie Batch-Migration im laufenden 24/7-Betrieb.

Aus der Praxis

Vier Praxisfälle, die immer wiederkehren

Die Beispiele sind anonymisiert (Kundendaten gebe ich grundsätzlich niemals weiter). Werte aus der Erinnerung sind als Größenordnung angegeben – die exakten Ursachen und Wirkungen habe ich im Laborabschnitt darunter an 10 Millionen Zeilen reproduzierbar nachgestellt und gemessen.

Prozedur · Sperren

Der Fehler, der nur in der Produktion auftrat

Ein Kunde in Österreich erlebte im laufenden Betrieb Blockierungen durch Transaktionen, die sich im Testsystem nie nachstellen ließen. Ursache war eine Stored Procedure, die ihre Abfrage je nach Fall per String-Verkettung zusammensetzte und dynamisch ausführte.

Ich habe sie in einen Verteiler (Delegator) und zwei Prozeduren mit festem, parametrisiertem T-SQL aufgeteilt. Damit prüft SQL Server die Abfragen vorab und nutzt für jeden Zweig einen stabilen Ausführungsplan im Plan-Cache. Bis zum Ende meines Einsatzes trat der Fehler nicht wieder auf.

Index · Größenordnung ×100

Tage am Code, Minuten am Index

Ein Entwickler hatte mehrere Tage versucht, eine langsame Abfrage im C#-Code zu beschleunigen. Die Ursache lag in der Datenbank: Durch einen fehlenden abdeckenden Index musste SQL Server Millionen Zeilen per Scan und Key Lookup lesen.

Nach Anlage des passenden Index lief die Abfrage rund hundertmal schneller (Größenordnung aus der Erinnerung), ohne eine einzige Zeile Programmcode in der Anwendung zu ändern.

Nachtlauf · Stunden

Von mehreren Stunden auf gut eine Stunde

Nächtliche Reports und ETL-Strecken, die morgens nicht fertig sind, bleiben selten allein: Wer lange läuft, hält Exklusiv- und Seitensperren (`LCK_M_*`) und bremst die Prozesse neben sich – die wiederum andere blockieren.

Solche Nachtläufe habe ich regelmäßig von mehreren Stunden auf gut eine Stunde gebracht, indem ich zu große Transaktionen aufgelöst, Schleifen durch mengenorientiertes SQL ersetzt und die wenigen Engpässe im Ausführungsplan beseitigt habe.

NoSQL · Architektur

Von Sekunden auf Millisekunden – durch Quelltext-Analyse im Kopf

Ein Kunde speicherte in seiner NoSQL-Datenbank Session-Variablen, die mehrere Sessions gemeinsam nutzten. Die Anwendung war massiv zu langsam und es war extrem eilig. Eine Testumgebung mit den Kundenkonfigurationen war kurzfristig nicht herstellbar, Logs oder Messdaten existierten nicht.

Ich habe den Quelltext Zeile für Zeile durchdacht und den Engpass identifiziert: Eine Tabelle, die festhielt, welche Session welche Variablen nutzte, wurde bei jedem Zugriff mehrfach durchsucht – pro Durchlauf ein bis zwei Sekunden Verzögerung.

Die Lösung war ein NoSQL-Muster statt relationaler Suche: Die Session erhält unter ihrer bekannten ID direkt die Referenzen auf ihre Variablen. Das Kunden-Team hat das Prinzip sofort verstanden und selbst umgesetzt: Reaktionszeit unter wenigen Millisekunden – kein spürbarer Zeitaufwand mehr.

Demonstration auf Testdaten · gemessen statt behauptet

Was ein passender Index ausmacht – Stufe für Stufe gemessen

Dieselbe Suchabfrage (`WHERE Nachname = … AND Stadt = … AND GeschaeftsJahr >= …`) auf einer Tabelle mit 1 und 10 Millionen Zeilen, jeweils mit einer besseren Indexstufe. Die Messung läuft vollautomatisch per PowerShell- und T-SQL-Skript und ist jederzeit reproduzierbar.

Ausgangszustand (Stufe 0 · Kein Index) 1.906 ms Laufzeit · 349.716 Reads
Optimiert (Stufe 4 · Covering Index) 5,3 ms Laufzeit · 11 Reads
Faktor bei 10 Mio. Zeilen ×358 schneller (×31.792 weniger Lesevorgänge)
Stufe 0 Kein Index

Clustered Index Scan: Liest alle 350.000 Datenseiten komplett durch. Höchste I/O- und CPU-Belastung auf Anschlag.

349.716 Reads 1.906 ms
Stufe 1 Index auf 1 Spalte

Tipping Point: Der Optimizer ignoriert den Index, weil Key Lookups bei 271.000 Treffern teurer wären als ein Scan.

349.667 Reads 1.843 ms (×1,0)
Stufe 2 Index je Spalte

2× Seek + Merge Join + Key Lookup: Schneller, aber tausende Seitensprünge (Key Lookups) belasten I/O und Cache.

3.866 Reads 126 ms (×15,1)
Stufe 3 Kombi-Index

Index Seek + Key Lookup: Suchspalten optimal gereiht, aber fehlende Ausgabespalten erzwingen noch 2.692 Lookups.

2.686 Reads 71 ms (×26,8)
Stufe 4 Covering Index

Reiner Index Seek (INCLUDE): Alle benötigten Daten liegen direkt im B-Tree. Kein einziger Zugriff auf die Basistabelle nötig.

11 Reads 5,3 ms (×358)

Vollständige Messdaten & Ausführungspläne im Detail

Alle Rohdaten (1 Mio. vs. 10 Mio. Zeilen, Speicherbedarf, Einfügezeiten, Stufe 5 mit gefiltertem Index und Parameter-Sniffing-Falle), Ausführungspläne und die didaktische Erklärung, wie das Mess-Beispiel konstruiert wurde.

Zu den Labor-Messdaten →
Demonstration auf Testdaten · weitere Messungen aus meinem SQL-Labor

Zehn Engpässe, die ich im Labor exakt nachgemessen habe

Ein fehlender Index ist nur der Anfang. Für meine Beratungs- und Optimierungspraxis habe ich ein eigenes Test-Framework aufgebaut, das typische Architekturentscheidungen an 1 bis 100 Millionen Zeilen inklusive Showplan-XML, CPU-Zeit und Memory Clerks vermisst.

Collation & Typ-Rangfolge · 10 Mio. Zeilen

Implizite Konvertierung: 3 Reads gegen 27.469 Reads

Wenn .NET/EF einen Unicode-Parameter (@p nvarchar) an eine varchar-Spalte übergibt, zwingt die Typ-Rangfolge unter Standard-SQL-Collation zu einem Zeilen-Scan:

nvarchar (Scan)
27.469 Reads · 446 ms
Passend (Seek)
3 Reads · 2,7 ms

Unter SQL-Sortierung muss SQL Server jede einzelne Zeile umwandeln (Plan-Warnung: CONVERT_IMPLICIT, 3.011 ms CPU-Zeit). Aus 3 Seitengriffen wird ein massiver Scan. Labor-Messdaten & Sortierungs-Matrix ansehen →

Mengenübergabe & Cache · 10 Mio. Zeilen

Lange IN-Listen (2.000 IDs) und Ad-hoc-Flut

Wie übergibt man hunderte oder tausende IDs aus C# an SQL Server? Vier Verfahren bei 10 bis 2.000 IDs und bei 50.000 Einzelaufrufen gegeneinander gemessen:

Literal-Liste
6.376 KB Cache · 589 ms
TVP (2.000 IDs)
200 KB Cache · 222 ms

Einzelparameter blähen den Plan-Cache auf; 50.000 Ad-hoc-Abfragen belegen 781 MB Speicher gegen 0,1 MB bei parametrisierten Aufrufen. Table-Valued Parameters (TVP) liefern einen stabilen Plan ohne Kompilierlast. Labor-Messdaten & 4-Methoden-Vergleich ansehen →

Datenmodell & Speicher · 1 Mio. Zeilen

Zusammengesetzter Textschlüssel vs. Surrogate Key

Ein dreiteiliger Fachschlüssel (Mandant + Bereich + Artikelnummer, ca. 56 Bytes) wiederholt sich in jeder Kindtabelle und jedem Index:

Textschlüssel
287 MB · 19.075 Reads
Surrogate int
65 MB · 3.919 Reads

Der Textschlüssel macht Tabellen und Indizes 4,4-mal so groß und den Verbund über alle Kinder 2,5-mal so langsam (1.142 ms vs. 471 ms). Der Fachschlüssel bleibt als UNIQUE-Constraint auf der Elterntabelle erhalten. Labor-Messdaten & Metadaten-Skript ansehen →

SARGability · 10 Mio. Zeilen

Führender Platzhalter (LIKE '%berg')

Eine Endungssuche wie WHERE Firma LIKE '%berg' ist nicht sargable – selbst mit Index auf Firma liest SQL Server alle 49.001 Indexseiten:

Standard LIKE
49.022 Reads · 3.890 ms
REVERSE + Idx
43 Reads · 6,3 ms (×617)

Mit einer berechneten Spalte FirmaRev AS REVERSE(Firma) und Index wird aus der Endungssuche ein gezielter Präfix-Seek. Das senkt die Lesevorgänge um den Faktor ×1.140 und die Laufzeit von 4 Sekunden auf 6,3 Millisekunden. Labor-Messdaten & Berechnete Spalte ansehen →

Servergrenzen · 1 Mio. Zeilen

Linked Server vs. OPENQUERY & Collation-Falle

Abfragen über Instanz- und Datenbankgrenzen kippen je nach Syntax und Sortierung in völlig unterschiedliche Ausführungspläne:

OPENQUERY
167.982 Reads · 1.224 ms
Linked 4-part
746 ms (stabiler Plan)

Bei großen Verbünden zwingt OPENQUERY in zeilenweise Nested Loops. Weicht zudem die Collation der Zieldatenbank ab, verhindert die implizite Konvertierung den Index Seek (Faktor ×119 I/O). Labor-Messdaten & Remote-Vergleich ansehen →

Normalisierung · 1 Mio. Zeilen

Klartext-Spalten vs. Nachschlagetabellen (3NF)

Stehen Attribute wie Stadt und Zahlungsart als Klartext in der Bewegungstabelle statt als schlanker int-Fremdschlüssel:

Klartext-Scan
4.074 Reads · 1.518 ms
3NF + Join
1.608 Reads · 33 ms (×46,4)

Auf der kleinen Nachschlagetabelle kostet die Mustersuche fast nichts, bevor über die kompakte StadtId gejoint wird – 46,4-mal schneller. Auch die Widerspruchsprüfung sinkt von 21.584 auf 32 Reads. Labor-Messdaten & Modellierungsvergleich ansehen →

Prozedur gegen View · 10 Mio. Kunden

Erst alles berechnen, dann filtern: Faktor ×2.600

Im gemessenen Fall (synthetische Daten, kalter Cache) dieselbe Frage – Umsatz der Kunden einer Stadt – einmal über eine View, einmal über eine Prozedur ohne Parameter, deren Ergebnis erst außen gefiltert wird:

Prozedur, außen gefiltert
134.172 ms
View, WHERE außen
52 ms

Die View lässt den Filter bis an den Index durch; die Prozedur rechnet alle 10 Mio. Kunden durch. Eine Mehranweisungs-Funktion liegt mit 53.095 ms dazwischen. Mit Parameter ist die Prozedur so schnell wie die View (54 ms). Labor-Messdaten ansehen →

Partitionierung · 100 Mio. Buchungen

Einen Monat entfernen: 14.082 ms gegen 8,5 ms

Ein Monat (833.333 Zeilen) wird aus 100 Mio. Buchungen entfernt – per DELETE oder durch Leeren der Monatspartition:

DELETE
14.082 ms mit Datumsindex (ohne: 67.298 ms)
Partition leeren
8,5 ms (×1.657)

DELETE protokolliert jede Zeile und pflegt jeden Index; das Leeren einer Partition gibt nur deren Seiten frei. Voraussetzung: Der Monat liegt genau in einer Partition, alle Indizes sind gleich partitioniert. Labor-Messdaten ansehen →

Partitionierung · 100 Mio. Buchungen

Partitionierung macht Abfragen nicht automatisch schneller

Dieselben Buchungen, einmal mit einfachem Index nach Datum, einmal nach Monat partitioniert:

Konto, partitioniert
285 ms
Konto, nicht partitioniert
45 ms

Die Kontoabfrage kennt den Monat nicht und sucht in allen 120 Partitionen. Auch die Monatssumme war partitioniert nicht schneller: 244 ms gegen 173 ms mit einfachem Datumsindex. Partitionierung dient der Datenpflege; für Abfragen ersetzt sie den passenden Index nicht. Labor-Messdaten ansehen →

Join · 100 Mio. Kunden, 400 Mio. Positionen

Join über drei Tabellen: Faktor ×632

Gesucht sind die 400 Positionen der Kunden einer Stadt – ohne und mit Indizes auf Stadt und Fremdschlüsseln:

Nur Primärschlüssel
6.843.764 Reads · 41.982 ms
Mit Indizes
3.144 Reads · 66 ms

Mit drei Unterabfragen je Kunde statt des Joins: 50.737 ms gegen 232 ms (×219). Labor-Messdaten ansehen →

Typische Ursachen

Woran Datenbanken meistens langsam werden

In gewachsenen Datenbanken wiederholen sich die Muster. Diese sechs Ursachen begegnen mir am häufigsten.

Fehlende Covering Indexes & Key Lookups

Ein Index pro Spalte hilft wenig. Entscheidend sind Spaltenreihenfolge (Gleichheit vor Bereich), abdeckende Spalten (INCLUDE gegen teure Key Lookups) und gefilterte Indexe – samt Beachtung von Parameter Sniffing und OPTION (RECOMPILE).

Implizite Konvertierung (CONVERT_IMPLICIT)

Passen Datentyp oder Collation von Spalte und Parameter nicht zusammen (z. B. varchar-Spalte gegen nvarchar aus Entity Framework), wandelt SQL Server jede Zeile beim Lesen um – und fällt vom Index Seek auf einen kompletten Scan zurück.

Ad-hoc-SQL, Plan-Cache-Bloat & Parameter Sniffing

Als Text verkettete Abfragen fluten den Plan-Cache mit Einmal-Plänen, kosten bei jedem Aufruf CPU-Kompilierzeit und verhindern stabile Ausführungspläne. Parametrisierte Aufrufe und Table-Valued Parameters (TVP) beseitigen Plan-Cache-Flut und Kompilierlast; gegen Parameter Sniffing helfen gezielt OPTION (RECOMPILE) oder getrennte Pläne.

Fehlende SARGability (Funktionen & führende Wildcards)

Bedingungen wie LIKE '%berg' oder Funktionen auf Indexspalten (YEAR(Datum) = …, ISNULL(Spalte, …)) machen vorhandene Indexe blind. Umgestellte Prädikate oder indizierte berechnete Spalten stellen den Index Seek wieder her.

Breite Clustered Keys & fehlende Normalisierung

Zusammengesetzte Text-Primärschlüssel vervielfachen sich in jedem Fremdschlüssel und jedem Nonclustered Index der Kindtabellen. Technische Schlüssel (int/bigint) halbieren oft den RAM-Bedarf im Buffer Pool.

Sperrketten (LCK_M_*), Lock Escalation & RCSI

Große Transaktionen und Cursorschleifen halten Sperren und lösen Kettenblockaden aus – besonders in Nachtläufen. Mengenorientiertes SQL, kleinere Transaktionsschritte und passende Isolationsstufen lösen den Stau auf.

Methodik & eigene Diagnose-Werkzeuge

Keine Blindflüge: Wie ich analysiere, ohne Ihren Betrieb zu gefährden

In gewachsenen Datenbanken hat jede Änderung Nebenwirkungen: Welche Prozedur, welche View, welcher SQL-Agent-Job oder welches SSIS-Paket bricht, wenn man eine Tabelle oder einen Schlüssel anfasst? Deshalb verlasse ich mich nicht auf Vermutungen, sondern auf deterministische Werkzeuge.

1 · Katalog & DMVs

Diagnose ohne Last auf Ihren Nutzdaten

Meine Analyse-Skripte werten Systemkataloge (sys.dm_db_partition_stats, sys.dm_exec_query_stats, sys.index_columns, Showplan-XML) aus, ohne große Tabellen zu scannen. So lässt sich der Speichergewinn eines Schlüssel- oder Indexumbaus schon vor dem Eingriff aus den Katalogdaten berechnen.

2 · COMPIDDA · Extra Assessment

Technische Abhängigkeiten & ganze IT-Landschaften durchleuchten

Mit COMPIDDA habe ich ein eigenes Analyse-Toolset (über 4.000 automatisierte Tests) entwickelt, das bis zu 19 Quelltypen – T-SQL (Prozeduren, Views, Trigger, dynamisches SQL, OPENQUERY, Linked Server über ScriptDom), SSIS-Pakete, SQL-Jobs, SSRS-Berichte und C#/.NET-Zugriffe – einliest und als Abhängigkeitsgraph (R/W/X) mit exakter Fundstelle darstellt. Für komplette gewachsene oder verwaiste IT-Landschaften ist dies als eigenständiges, separat bepreistes Vor-Ort-Assessment mit Toolset-Einsatz buchbar (Details zum COMPIDDA-Assessment →).

3 · Vorher-Nachher-Messung

Jede Wirkung wird gemessen, nicht geschätzt

Jede Maßnahme bekommt vorab ein messbares Erfolgskriterium – Laufzeit, Lesevorgänge, Wartezeit – und wird danach unter denselben Bedingungen nachgemessen; Ergebnismengen vergleiche ich per Prüfsumme mit dem Altstand. KI-Werkzeuge nutze ich als Beschleuniger für Skripte und Testfälle; ob dabei Code oder Metadaten aus Ihrem Haus verarbeitet werden dürfen, entscheiden Sie vorab. Geraten wird an Ihrer Datenbank nichts.

Vorgehen

Minimalinvasiv – der laufende Betrieb bleibt sicher

Wenige Eingriffe an den wirksamsten Stellen

Wo keine ausreichenden Tests vorhanden sind, schreibe ich keinen Code im großen Stil um. Ich setze gezielt an den Stellen an, die am meisten bewirken – oft an Indexen, Statistiken und einzelnen Stored Procedures, ohne die Anwendung anzufassen. Wenn tiefere Umbauten nötig sind, sichern wir die abhängigen Pfade vorab mit automatisierten Tests und Prüfsummen ab.

Bevorzugte Prüfstrategie: Index vor Code vor Hardware

Eine Indexoptimierung wirkt oft innerhalb von Stunden. Änderungen an der Programmierung brauchen Tage bis Monate. Neue Hardware kostet Beschaffungszeit, eine Auszeit des Servers und Geld – und bringt meist nur einen Bruchteil dessen, was ein passender Index erreicht (im Labor war bei 100 Mio. Zeilen ein auf 2 Kerne und 1.300 MB gedrosselter SQL Server mit Covering Index 14.864-mal so schnell wie ein 8-Kern-Server mit 13.000 MB ohne Index; Laborwert mit synthetischen Daten, Zeiten um 1 ms sind grob – schon bei 2 ms wären es rund 8.900-mal; Plattengeschwindigkeit und Speicherbandbreite sind nicht nachgebildet). Deshalb ist dies meine bevorzugte Prüfreihenfolge.

Warum Hardware-Tuning 2026 eine Kostenfalle ist (Vergleich ansehen) →

Wirtschaftlichkeit & IT-Strategie

Warum mehr Server-Hardware einen fehlenden Index nicht ersetzt – und 2026 eine Kostenfalle sein kann

Wenn Datenbanken langsam werden, ist der Reflex vieler IT-Abteilungen: „Wir brauchen einen größeren Server, mehr RAM und schnellere Datenträger.“ Doch mehr Hardware bringt bei einer Abfrage ohne passenden Index nur einen begrenzten Faktor: Im Labor war bei 100 Mio. Zeilen der Server mit 8 Kernen und zehnfachem Speicher nur 1,7-mal so schnell wie der mit 2 Kernen – bei hohen Microsoft-Lizenzkosten und langer Vorlaufzeit. Ein passender Index machte die Abfrage im Labor bei 10 Mio. Zeilen dagegen ×358 schneller – Arbeit weniger Stunden.

Weg A · Der Hardware-Reflex (Monster-Server)

Neuer Server ohne passende Indexe

Mehr CPU-Kerne und schnellere NVMe-Platten beschleunigen nur den Transport, ändern aber nicht die Ursache: Der Server muss weiterhin dieselbe gigantische Datenmenge durch den I/O-Pfad pumpen.

  • Datenzugriff: 349.716 Seiten (Full Table Scan) – pumpt dieselbe unnötige Datenmenge nur schneller im Kreis
  • Geschwindigkeitsplus: Im Labor nur Faktor 1,7 (8 statt 2 Kerne, zehnfacher Speicher, 100 Mio. Zeilen ohne Index)
  • Investition & Lizenzen: rund 63.000 $ (Standard) bis 242.000 $ (Enterprise) Listenpreis für 32 Kerne (eigene Rechnung aus der Microsoft-Preisliste SQL Server 2025)
  • Vorlaufzeit 2026: Lange Lieferzeiten bei Server-Bauteilen, z. B. BMC-Chips 21 bis 26 Wochen (TrendForce, April 2026) + Umbau-Ausfall
Weg B · Gezieltes Index- & Abfrage-Tuning

Vorhandener Server mit passendem Index

Der Index ändert nicht die Geschwindigkeit der Leitung, sondern wie viel transportiert werden muss: Die Abfrage liest punktgenau nur noch die exakten Treffer.

  • Datenzugriff: 11 Seiten (Reiner Index Seek) – ×31.792 weniger I/O-Last
  • Geschwindigkeitsplus: ×358 schneller (im Labor bei 10 Mio. Zeilen von 1.906 ms auf 5,3 ms gemessen)
  • Investition & Lizenzen: 0 € neue Hardware, 0 € zusätzliche Microsoft-Kernlizenzen (bestehende Umgebung genügt)
  • Vorlaufzeit 2026: In wenigen Stunden bis Tagen produktiv – ohne Hardware-Bestellung, ohne Beschaffungsstopp
Lizenzkosten-Falle

Warum mehr Cores Ihr Budget auffressen

Microsoft lizenziert SQL Server pro Prozessorkern (2-Kern-Pack laut Microsoft-Preisliste SQL Server 2025: Standard 3.945 $, Enterprise 15.123 $, geschätzter Einzelhandelspreis). Wer von 8 auf 32 Kerne aufrüstet, um ineffiziente Abfragen per Rechenpower zu überdecken, zahlt allein für die SQL-Enterprise-Kerne rund 180.000 $ mehr – plus Windows-Server-Kernlizenzen und gegebenenfalls Lizenzen für weitere Knoten.

Marktrealität 2026

Teurer Speicher, lange Lieferzeiten (TrendForce)

Weil der weltweite KI-Boom DRAM- und NAND-Kapazitäten in High-Bandwidth-Memory (HBM) saugt, prognostizierte TrendForce im Februar 2026 für Server-DRAM im 1. Quartal 2026 einen Preisanstieg von rund 90 % gegenüber dem Vorquartal (Quelle). Für Server-Bauteile wie BMC-Chips nannte TrendForce im April 2026 Lieferzeiten von 21 bis 26 Wochen (Quelle). Die alte Management-Annahme „Hardware kaufen geht schneller als Entwickler ransetzen“ wird 2026 durch Preise und Lieferzeiten bei einzelnen Bauteilen erschwert.

SQL Server entlasten

Der Dekorator-Fehler: Berechnungen in den Client

Berechnete Anzeigetexte (z. B. Zusammenfügen von Anrede, Vorname, Nachname oder Stringoperationen) gehören in die C#/.NET-Anwendung, nicht in den SQL Server. SQL Server ist der teuerste und am schwersten skalierbare Knoten. Textformatierungen in Views verbrauchen teure Kern-Zyklen und können Parallelität und Index-Seeks ausbremsen.

Wann neue Hardware doch der richtige Schritt ist (Ehrliche Abgrenzung)

Eine seriöse Datenbankberatung verkauft keine Patentrezepte. Es gibt Szenarien, in denen Hardware-Investitionen tatsächlich alternativlos sind:

Die 4-Stufen-Reihenfolge für Entscheider: 1. Messen, wo die Wartezeit entsteht (I/O, CPU, Sperren oder Netzwerk). 2. Indexe prüfen und optimieren (Wirkung in Stunden, keine Kernlizenzkosten). 3. Abfragen und Anwendungscode anpassen (Tage bis Wochen). 4. Hardware erst als letzten Schritt – wenn die Messung eindeutig belegt, dass physikalische I/O- oder Speichergrenzen der echte Engpass sind.

Legacy T-SQL · Refactoring ohne Betriebsrisiko

Gewachsenen, unbeherrschbaren Stored-Procedure-Code sanieren

Tausende Zeilen T-SQL, historische Verschachtelungen, Cursors statt Mengenoperationen – und die Entwickler von damals sind längst nicht mehr im Unternehmen. Niemand im Team traut sich an den Code ran, weil bei jedem Eingriff unvorhersehbare Folgefehler in der Produktion oder Monatsabrechnung drohen. Ich bringe Ruhe, Transparenz und Geschwindigkeit in gewachsene Prozedur-Landschaften.

Praxis-Beweis · rund 130 Stored Procedures saniert

Internationaler Spirituosenkonzern: Sanierung einer komplexen MSSQL-Prozedurenlandschaft

Bei einem internationalen Spirituosenkonzern lief eine historisch gewachsene Landschaft aus rund 130 MSSQL-Stored-Procedures zur nächtlichen Datenkonsolidierung und Fehlerkorrektur: Tief verschachtelte Logik führte zu langen Laufzeiten und blockierte Folgesysteme.

Ich habe die gesamte Prozedurenlandschaft schrittweise analysiert, entwirrt und in weiten Teilen durch robuste, wartbare und signifikant performantere T-SQL-Lösungen abgelöst – im laufenden Betrieb, ohne Betriebsunterbrechung, abgesichert durch Prüfsummentests.

„Herr Hagen verfügt über eine außergewöhnlich tiefgehende technische Expertise in den Bereichen Datenbanken, Anwendungsarchitektur und Performance-Optimierung. Er arbeitet sehr strukturiert, analytisch und eigenverantwortlich und ist in der Lage, auch komplexe und historisch gewachsene Systemlandschaften schnell zu durchdringen und nachhaltig zu verbessern. Durch seine Tätigkeit konnten Transparenz, Wartbarkeit, Stabilität und Performance der eingesetzten IT-Systeme signifikant verbessert werden.“

— aus dem schriftlichen Referenzschreiben des Kunden

Säule 1 · Transparenz

Abhängigkeiten sichtbar machen (COMPIDDA)

Bevor die erste Codezeile angefasst wird, liest mein Analyse-Werkzeug COMPIDDA den Codebestand aus, T-SQL über den offiziellen SQL-Syntaxbaum (ScriptDom). Sie sehen als interaktives Abhängigkeitsdiagramm: Welche Prozedur ruft wen auf? Wo greifen Views, Trigger, SQL-Jobs oder C#-Services zu? Was sich nicht eindeutig auflösen lässt, sehen Sie als markierten offenen Punkt. Für ganze IT-Landschaften ist dies auch als eigenständiges, separat bepreistes Vor-Ort-Assessment buchbar.

Säule 2 · Sicherheit & DevOps

Deterministische Testabsicherung & Prüfsummen

Gegen Regressionsfehler zeichnen wir vorab reale Eingabe- und Ausgabedaten auf – in Ihrer Umgebung und nach Ihrer Freigabe; die Aufzeichnungen verlassen Ihr Haus nicht. Für jeden aufgezeichneten Fall belegen NUnit-Testfälle und Prüfsummen (SHA-256) über die Ergebnismengen vor dem Deployment (auch direkt in Ihrer Azure-DevOps-Pipeline), dass die neue Prozedur exakt dieselben Daten liefert wie der Altcode.

Säule 3 · Sanierung

Entflechtung & mengenorientiertes T-SQL

Ich ersetze zeilenweise Cursors und WHILE-Schleifen durch mengengestützte Abfragen (Window Functions, CTEs), löse Deadlock-trächtige Transaktionsklammern auf und wandle ad-hoc verkettetes dynamisches SQL in feste, vorkompilierte Prozeduren mit stabilem Plan-Cache um.

Akute Notfall-Hilfe für Ihre blockierende Prozedur

Brennt bei Ihnen aktuell ein Nachtlauf oder blockiert eine 2.000-Zeilen-Prozedur das gesamte System? Schicken Sie mir Ihren Problemfall.

Problemfall unverbindlich schildern →
Ehrlich gesagt

Warum hier Laborwerte stehen und keine Kundenzahlen

Oft werde ich gefragt, welche Kundenabfrage ich um welchen exakten Faktor beschleunigt habe. Messprotokolle, Schemas und Produktionsdaten aus Kundensystemen bleiben beim Kunden; ich nehme sie nicht mit und veröffentliche sie nicht. Werte aus früheren Projekten nenne ich deshalb nur als Größenordnung – und erfundene Zahlen nenne ich gar nicht.

Stattdessen habe ich typische Fälle im eigenen SQL-Labor nachgestellt: automatisiert, auf 1 bis 100 Millionen Zeilen synthetischer Testdaten, mit offengelegtem T-SQL, Ausführungsplänen und exakten Seitenzugriffen. Den Beweis an Ihrer eigenen Datenbank tritt der Performance-Check an.

Performance-Check · der Beweis auf Ihren Daten

Geben Sie mir Ihre langsamste Abfrage oder Ihren kritischsten Nachtlauf

Der Performance-Check ist mein Einstiegsangebot. Die Laborwerte auf dieser Seite sind eine Demonstration auf Testdaten; im Performance-Check sehen Sie die Wirkung an Ihrem eigenen System, bevor Sie über ein größeres Projekt entscheiden. Umfang und Aufwand stimmen wir im Erstgespräch ab und halten sie vorab schriftlich fest.

Ablauf

Was ich tue

  • Messen, wo die Zeit verloren geht: Wartezeiten, teuerste Abfragen, Sperren.
  • Ursache an Ihrer kritischsten Abfrage oder Ihrem Nachtlauf eingrenzen: Ausführungsplan, Lesevorgänge, Sperrverhalten.
  • Die wichtigste direkt umsetzbare Maßnahme nach Ihrer Freigabe einspielen und vorher wie nachher per Skript messen. Erfordert die Ursache tiefere Code- oder Architekturumbauten über den Check-Rahmen hinaus, erhalten Sie die exakte Beweisführung, Priorisierung und Aufwandsschätzung als Entscheidungsgrundlage.
Lieferumfang

Was Sie erhalten

  • Kurzfassung für die Leitung: Ursache, Wirkung, Aufwand.
  • Technische Befunde mit Messwerten vorher und nachher.
  • Maßnahmenliste nach Wirkung geordnet, je Maßnahme Erfolgskriterium und Rückweg.
  • Alle verwendeten Skripte, damit Ihr Team nachmessen kann.

Beispielbefund ansehen (PDF, Labordaten) →

Voraussetzungen

Was ich brauche

  • Lesenden Zugriff auf Systemsichten (VIEW SERVER STATE); Tabelleninhalte sind nicht nötig.
  • Zugang nach Ihren Regeln: Fernzugang, Bildschirmfreigabe oder vor Ort.
  • Eine Ansprechperson, die Änderungen freigeben kann. Eine Geheimhaltungsvereinbarung (NDA) auf Wunsch vorab.
📄 Greifbares Lieferergebnis vorab prüfen

Wie sieht das Ergebnis eines Performance-Checks konkret aus?

Sehen Sie sich vorab einen vollständigen Beispielbefund (PDF auf Basis von Labordaten) an: mit Management-Kurzfassung für Entscheider, technischen Vorher-Nachher-Messwerten, priorisierter Maßnahmenliste, Rückweg-Skripten und Kosten-Nutzen-Einordnung.

„… in der Lage, auch komplexe und historisch gewachsene Systemlandschaften schnell zu durchdringen und nachhaltig zu verbessern. Durch seine Tätigkeit konnten Transparenz, Wartbarkeit, Stabilität und Performance der eingesetzten IT-Systeme signifikant verbessert werden.“

Auszug aus der Referenz · internationaler Spirituosenkonzern

„Herr Hagen war in ganz besonders hohem Maße zuverlässig … zeigte vor allem aber auch immer wieder vollen Einsatz, wenn es darum ging, den operativen Betrieb sicherzustellen.“

Auszug aus dem Zeugnis · NXP Semiconductors

Weitere Referenzen auf der Startseite; vollständige Nachweise auf Anfrage.