Wissen · SQL Server Performance · Lab

Mehr Kerne, schnellere Kerne oder eine bessere Abfrage?

Wann mehr Kerne helfen, wann nur ein schnellerer Kern und wann die bessere Abfrage. Mit Laborbelegen und den Kennzahlen für einen echten CPU-Engpass.

23.10.2026 · ca. 10 Minuten · Lab vom 23.10.2026 · SQL Server 2022

Animation zu Versuch 3: Jede Kasse steht für einen Kern, jeder Punkt für eine Abfrage. Mit 4 Kernen blockiert ein überladener Wagen, die Tagesabfrage, eine Kasse, davor staut sich eine Schlange: 163 Abfragen je Sekunde. Mit 8 Kernen wird die Schlange kürzer, der Wagen blockiert weiter eine Kasse: 234. Mit 4 Kernen und verbesserter Abfrage ist der Wagen ein normaler Einkauf, alle Kassen arbeiten gleichmäßig: 584 Abfragen je Sekunde, gleiche Hardware, 3,6-facher Durchsatz.

Animation überspringen ↓
Labor · drei VersucheSQL Server 2022
Versuch 1 · eine Abfrage, seriell
2 Kerne2.382 ms12 Kerne2.368 ms
Versuch 3 · Abfragen je Sekunde
4 Kerne1638 Kerne2344 Kerne, Abfrage verbessert584
Versuche lesen ↓

Kurz gesagt

Ob viele oder schnelle Kerne besser sind, entscheidet Ihre Last, nicht das Datenblatt. Eine einzelne Abfrage, die seriell läuft, wird nur durch einen schnelleren Kern schneller. Mehr Kerne helfen parallelen Abfragen und vielen gleichzeitigen Sitzungen, aber nicht unbegrenzt und nicht linear.

Bevor Sie über Kerne entscheiden, lohnt die Frage, wofür die CPU heute arbeitet. In unserem Labor verbrauchten 5 Prozent der Aufrufe 84 Prozent der CPU. Die doppelte Kernzahl brachte 43 Prozent mehr Durchsatz, die verbesserte Abfrage auf der alten Hardware das 3,6-Fache.

Ein echter CPU-Engpass zeigt sich nicht an einer einzelnen Zahl. Lange Antwortzeiten allein beweisen ihn nicht, und auch der Anteil der Signal-Wartezeit allein nicht. Erst mehrere Kennzahlen zusammen ergeben ein belastbares Bild.

Das Bild: die Kasse im Supermarkt

Stellen Sie sich die CPU als Kassenbereich vor. Jeder Kern ist eine Kasse, jede Abfrage ein Einkauf.

  • Ein schnellerer Kassierer verkürzt jeden einzelnen Einkauf. Das ist ein schnellerer Kern.
  • Mehr Kassen verkürzen die Schlange, aber nicht den einzelnen Einkauf. Das sind mehr Kerne für viele gleichzeitige Abfragen.
  • Ein großer Einkauf, auf mehrere Kassen verteilt, ist schneller fertig. Das Verteilen und Zusammenführen kostet aber zusätzliche Arbeit. Das ist eine parallele Abfrage.
  • Ein überladener Wagen blockiert eine Kasse lange, egal wie viele es gibt. Das ist die ineffiziente Abfrage, die den größten Teil der CPU verbraucht.

Mit diesem Bild lassen sich die drei Versuche lesen.

Im Bild: schnellerer Kassierer, verteilter Einkauf

Versuch 1: eine Abfrage, mehr Kerne

Erwartung Eine Abfrage, die auf einem einzigen Kern läuft, kann von zusätzlichen Kernen nicht profitieren. Dieselbe Abfrage parallel sollte schneller werden, aber mit wachsendem Aufwand.

Änderung Eine rechenintensive Auswertung über 5 Millionen Zeilen, einmal seriell (MAXDOP 1) und einmal parallel mit so vielen Threads, wie Kerne zugewiesen sind. Gemessen mit 2, 4, 8 und 12 Kernen.

Beobachtung

Kerneseriellparallelschneller als seriellCPU-Zeit parallel
22.382 ms1.933 ms1,23-fach1,38-fach
42.376 ms1.201 ms1,98-fach1,52-fach
82.384 ms612 ms3,89-fach1,65-fach
122.368 ms555 ms4,27-fach2,28-fach

Seriell lief die Abfrage mit 2 wie mit 12 Kernen gleich lang. Parallel wurde sie mit jedem Schritt schneller, aber der Gewinn je zusätzlichem Kern schrumpfte. Von 8 auf 12 Kerne sank die Laufzeit nur noch um 9 Prozent, die verbrauchte CPU-Zeit stieg um 38 Prozent.

Folgerung Für eine serielle Abfrage zählt nur die Geschwindigkeit eines Kerns. Im Labor konnten wir die Taktfrequenz nicht verändern; dass ein schnellerer Kern hier hilft, folgt daraus, dass die Kernzahl nichts bewirkt. Parallelität verkürzt die Laufzeit, kostet aber zusätzliche CPU-Zeit für das Verteilen und Zusammenführen. Wie viel davon sinnvoll ist, beschreibt der Beitrag zur Parallelität in PSG QX: Ziel ist die kürzere Laufzeit bei vertretbarem CPU-Einsatz, nicht eine kleinere Wartezeitstatistik.

Im Bild: mehr Kassen

Versuch 2: viele Sitzungen, mehr Kerne

Erwartung Viele gleichzeitige kurze Abfragen sollten von mehr Kernen profitieren, weil sich die Warteschlange verteilt.

Änderung 15 Sitzungen mit kurzen, rechenintensiven Abfragen ohne Pause, dazu eine Sitzung, die regelmäßig eine große Auswertung startet. Gemessen mit 2, 4, 8 und 12 Kernen.

Beobachtung

Kernekurze Abfragen je Sekundep95 kurze AbfrageAuswertung (Median)CPU-Auslastung
245060,8 ms7.187 ms99,9 %
477037,0 ms2.056 ms98,9 %
81.31721,7 ms660 ms94,3 %
121.37421,5 ms691 ms89,0 %

Bis 8 Kerne stieg der Durchsatz je Verdopplung um rund 70 Prozent, die Antwortzeiten sanken deutlich. Von 8 auf 12 Kerne kamen nur noch 4 Prozent hinzu. Gleichzeitig brauchte jede kurze Abfrage rund 40 Prozent mehr CPU-Zeit.

Folgerung Die verbreitete Faustregel „schnelle Kerne für OLTP, viele Kerne für Data Warehouse“ greift zu kurz. In unserem Labor profitierte gerade die Last aus vielen kurzen Abfragen von mehr Kernen, die einzelne lange serielle Abfrage dagegen gar nicht. Entscheidend ist, wie viel Arbeit gleichzeitig ansteht und ob sie sich verteilen lässt.

Dass 12 Kerne kaum mehr brachten als 8, ist ein Befund dieses Laborhosts. Unsere Kerne sind virtuelle CPUs unter Hyper-V. Mehr virtuelle CPUs bedeuten nicht automatisch mehr physische Rechenleistung, etwa wenn sie sich Hyperthreads, Takt oder Cache des Hosts teilen. Die genaue Ursache haben wir nicht isoliert.

Im Bild: mehr Kassen oder überladener Wagen

Versuch 3: mehr Kerne oder bessere Abfrage?

Erwartung Wenn eine einzelne ineffiziente Abfrage den Großteil der CPU verbraucht, sollte ihre Verbesserung mehr bringen als zusätzliche Kerne.

Änderung 16 Sitzungen mit kurzer Denkzeit. Jeder zwanzigste Aufruf ist eine Tagesabfrage, die eine Funktion auf eine Datumsspalte anwendet und deshalb den Index nicht gezielt nutzen kann. Ausgangslage auf 4 Kernen, dann dieselbe Last auf 8 Kernen, dann die Tagesabfrage so umformuliert, dass sie den Index nutzt, wieder auf 4 Kernen.

Beobachtung

VarianteAbfragen je Sekundep95 kurze Abfragep95 TagesabfrageCPU-Auslastung
4 Kerne, Ausgangslage16330,5 ms1.874 ms97 %
8 Kerne, sonst gleich23421,3 ms1.241 ms78 %
4 Kerne, Abfrage verbessert58414,3 ms7 ms61 %

Die Tagesabfrage machte 5 Prozent der Aufrufe aus und verbrauchte 84 Prozent der CPU. Die doppelte Kernzahl brachte 43 Prozent mehr Durchsatz; die Tagesabfrage blieb mit über einer Sekunde langsam. Die verbesserte Abfrage auf den alten 4 Kernen brachte das 3,6-Fache bei deutlich geringerer Auslastung.

Die Gegenprobe. Ist die Last bereits effizient und die CPU trotzdem voll, sieht es anders aus. Eine solche Last auf 4 Kernen bei 98 Prozent Auslastung schaffte mit 8 Kernen 62 Prozent mehr Durchsatz, die p95 halbierte sich von 31,8 auf 15,5 Millisekunden.

Folgerung Mehr Kerne helfen, wenn die CPU für notwendige Arbeit gebraucht wird. Verbraucht ein überladener Wagen den größten Teil der Kassenzeit, ist die bessere Abfrage der stärkere Hebel. Sie ist meist auch der günstigere, weil SQL Server in der Regel je Kern lizenziert wird.

Woran Sie einen echten CPU-Engpass erkennen

Im Labor haben wir eine Last schrittweise von 1 auf 32 gleichzeitige Sitzungen erhöht, auf 4 Kernen. Ab 16 Sitzungen war die CPU bei 99 Prozent, der Durchsatz blieb bei 922 Abfragen je Sekunde stehen, und die Antwortzeiten wuchsen mit jeder weiteren Sitzung. Zum Vergleich ein ganz anderer Fall: Abfragen, die auf eine Sperre warteten, brauchten 2 Sekunden, bei 0,6 Prozent CPU-Auslastung. Mehr Kerne hätten dort nichts geändert.

Daraus ergeben sich fünf Kennzahlen, die Sie zusammen betrachten:

  1. 01

    CPU-Auslastung

    über einen längeren Zeitraum nahe 100 Prozent, im Betriebssystem und je Kern betrachtet, nicht nur als Mittelwert.

  2. 02

    Wartende Aufgaben je Scheduler

    Stehen dauerhaft mehrere Aufgaben je Kern in der Warteschlange (runnable_tasks_count), fehlt Rechenzeit.

  3. 03

    Signal-Wartezeit je Sekunde

    im Verhältnis zur Zahl der Kerne. Gemeint ist die absolute Menge, nicht der Anteil.

  4. 04

    Durchsatz-Plateau

    Mehr gleichzeitige Arbeit bringt nicht mehr erledigte Arbeit, nur längere Antwortzeiten.

  5. 05

    CPU je Ausführung der teuersten Abfragen

    Wenige Abfragen mit hohem Verbrauch sprechen für eine Verbesserung der Abfrage vor neuer Hardware.

Zwei Fallen. Der Anteil der Signal-Wartezeit an der gesamten Wartezeit taugt allein nicht als Maß. Bei reiner Rechenarbeit gibt es kaum andere Wartezeiten; der Anteil lag in unserem Labor schon bei 26 Prozent CPU-Auslastung bei fast 100 Prozent. Und eine Durchschnittsauslastung unter 100 Prozent schließt eine Warteschlange nicht aus: Mit wenigen dauerhaft aktiven Verbindungen liefen in unserem Labor zeitweise zwei Abfragen auf demselben Scheduler, während drei andere leer blieben. Deshalb lohnt der Blick je Scheduler.

Die folgenden Abfragen lesen die Werte nur aus; wir haben sie auf SQL Server 2017 bis 2025 geprüft. Starten Sie sie, während das Problem auftritt. Die zweite filtert harmloses Hintergrundwarten heraus, sonst zeigt sie schon auf einem untätigen Server hohe Werte. Weil viele Aufgaben gleichzeitig warten, kann die Signal-Wartezeit je Sekunde größer als 1.000 Millisekunden sein. Zur Einordnung die Werte je Sekunde und Kern aus unserem Labor: etwa 0,3 ms bei einer einzelnen Sitzung, rund 440 ms bei 75 Prozent Auslastung, rund 1.080 ms bei voller Sättigung. Die dritte liest den Plan Cache; auf sehr großen Systemen kann sie einige Sekunden dauern. Die Werte im Plan Cache beginnen mit dem letzten Neustart oder dem Zeitpunkt, an dem ein Plan in den Cache kam.

Nur lesend – ändert nichts an Ihrer Datenbank

T-SQL · Warteschlange, Signal-Wartezeit und teuerste Abfragen
-- Nur lesend: Warteschlange je Scheduler (Momentaufnahme)
SELECT scheduler_id, cpu_id,
       current_tasks_count, runnable_tasks_count, active_workers_count
FROM sys.dm_os_schedulers
WHERE status = N'VISIBLE ONLINE'
ORDER BY scheduler_id
OPTION (MAXDOP 1);

-- Nur lesend: Signal-Wartezeit je Sekunde und Kern über 10 Sekunden,
-- ohne harmloses Hintergrundwarten (dieselbe Liste wie im Ratgeber, nicht vollständig)
IF OBJECT_ID('tempdb..#vorher') IS NOT NULL DROP TABLE #vorher;
SELECT wait_type, signal_wait_time_ms
INTO #vorher
FROM sys.dm_os_wait_stats
OPTION (MAXDOP 1);

WAITFOR DELAY '00:00:10';

DECLARE @kerne int = (SELECT COUNT(*) FROM sys.dm_os_schedulers
                      WHERE status = N'VISIBLE ONLINE');
SELECT kerne = @kerne,
       signal_ms_je_sekunde = SUM(n.signal_wait_time_ms - v.signal_wait_time_ms) / 10.0,
       signal_ms_je_sekunde_und_kern = SUM(n.signal_wait_time_ms - v.signal_wait_time_ms) / 10.0 / @kerne
FROM sys.dm_os_wait_stats AS n
JOIN #vorher AS v ON v.wait_type = n.wait_type
WHERE n.wait_type NOT LIKE N'SLEEP[_]%'
  AND n.wait_type NOT LIKE N'BROKER[_]%'
  AND n.wait_type NOT LIKE N'XE[_]%'
  AND n.wait_type NOT LIKE N'QDS[_]%'
  AND n.wait_type NOT LIKE N'HADR[_]%'
  AND n.wait_type NOT LIKE N'PARALLEL[_]REDO[_]%'
  AND n.wait_type NOT IN (
      N'AZURE_IMDS_VERSIONS', N'CHECKPOINT_QUEUE', N'CHKPT', N'CLR_AUTO_EVENT', N'CLR_MANUAL_EVENT',
      N'CLR_SEMAPHORE', N'DBMIRROR_DBM_EVENT', N'DBMIRROR_EVENTS_QUEUE',
      N'DBMIRROR_WORKER_QUEUE', N'DBMIRRORING_CMD', N'DIRTY_PAGE_POLL',
      N'DISPATCHER_QUEUE_SEMAPHORE', N'EXECSYNC', N'FSAGENT',
      N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'FT_IFTSHC_MUTEX', N'KSOURCE_WAKEUP',
      N'LAZYWRITER_SLEEP', N'LOGMGR_QUEUE', N'MEMORY_ALLOCATION_EXT',
      N'ONDEMAND_TASK_QUEUE', N'PREEMPTIVE_OS_FLUSHFILEBUFFERS',
      N'PREEMPTIVE_XE_GETTARGETSTATE', N'PVS_PREALLOCATE',
      N'PWAIT_ALL_COMPONENTS_INITIALIZED', N'PWAIT_DIRECTLOGCONSUMER_GETNEXT',
      N'PWAIT_EXTENSIBILITY_CLEANUP_TASK', N'REDO_THREAD_PENDING_WORK',
      N'REQUEST_FOR_DEADLOCK_SEARCH', N'RESERVED_MEMORY_ALLOCATION_EXT', N'RESOURCE_QUEUE', N'SERVER_IDLE_CHECK',
      N'SNI_HTTP_ACCEPT', N'SOS_WORK_DISPATCHER', N'SP_SERVER_DIAGNOSTICS_SLEEP',
      N'SQLTRACE_BUFFER_FLUSH', N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',
      N'SQLTRACE_WAIT_ENTRIES', N'VDI_CLIENT_OTHER', N'WAIT_FOR_RESULTS',
      N'WAITFOR', N'WAITFOR_TASKSHUTDOWN', N'WAIT_XTP_CKPT_CLOSE',
      N'WAIT_XTP_HOST_WAIT', N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG', N'WAIT_XTP_RECOVERY')
OPTION (MAXDOP 1);

-- Nur lesend: die zehn Abfragen mit der meisten CPU-Zeit seit Planerstellung
SELECT TOP (10)
       cpu_ms_gesamt = qs.total_worker_time / 1000,
       ausfuehrungen = qs.execution_count,
       cpu_ms_je_ausfuehrung = qs.total_worker_time / 1000.0 / qs.execution_count,
       anteil_cpu_prozent = 100.0 * qs.total_worker_time
                            / SUM(qs.total_worker_time) OVER (),
       abfrage = SUBSTRING(st.text, qs.statement_start_offset / 2 + 1, 200)
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY qs.total_worker_time DESC
OPTION (MAXDOP 1);

Den Weg vom Symptom zur Ursache bei hoher CPU-Last beschreibt der Ratgeber SQL Server unter Last langsam.

Viele oder schnelle Kerne?

Aus den Versuchen ergibt sich eine Zuordnung nach Lastprofil. Sie ersetzt keine Messung Ihrer Last, zeigt aber, wonach Sie suchen.

LastprofilWoran Sie es erkennenWas eher hilft
Einzelne lange, serielle Abfragen, etwa nächtliche Läufeeine Sitzung, ein Kern voll, Gesamtauslastung niedrigschnellere Kerne, oder die Abfrage effizienter bzw. parallelisierbar machen
Große Auswertungen, die parallel laufenParallelitäts-Wartezeiten, hohe CPU-Zeit je Ausführungmehr Kerne bis zu einem Punkt, dazu die passende Dosis über MAXDOP und Cost Threshold
Viele gleichzeitige kurze AbfragenCPU nahe 100 %, wachsende Warteschlange je Scheduler, Durchsatz-Plateaumehr Kerne, wenn die Arbeit selbst effizient ist
Wenige teure Abfragen dominieren die CPUhohe CPU je Ausführung bei wenigen Abfragenzuerst die Abfrage verbessern
Lange Antwortzeit bei niedriger CPUSperr-, I/O- oder andere Wartezeitenmehr Kerne helfen nicht; Ursache im Ratgeber suchen

Drei Dinge, die die Entscheidung mitbestimmen

  • Lizenzen. SQL Server wird in der Regel je Kern lizenziert. Jeder zusätzliche Kern kostet also nicht nur Hardware. Die Standard Edition nutzt außerdem nur eine begrenzte Zahl von Kernen, mehr dazu im Abschnitt zur Edition in der Upgrade-Entscheidungshilfe. Lizenzfragen bestätigt Ihnen Ihr Lizenzpartner. Wir verkaufen keine Lizenzen und beraten deshalb ohne Umsatzinteresse.
  • Virtualisierung. Eine virtuelle CPU ist kein physischer Kern. Ob zusätzliche virtuelle CPUs Rechenleistung bringen, hängt davon ab, was der Host darunter bereitstellt. Unser Labor zeigt, dass der Zugewinn ab einem Punkt klein werden kann.
  • Die Last von morgen. Eine Abfrage, die heute seriell läuft, kann nach einer Änderung parallel laufen und umgekehrt. Kerne sind eine Entscheidung für Jahre, Abfragen ändern sich mit jedem Release.

Häufige Fragen

Hilft mehr Hardware nicht einfach immer ein bisschen?

Ein bisschen oft, aber selten am meisten. In unserem Labor brachten doppelt so viele Kerne 43 Prozent mehr Durchsatz, die verbesserte Abfrage das 3,6-Fache. Hilft die Hardware nur, weil eine Abfrage zu viel arbeitet, wächst das Problem mit den Daten weiter.

Unsere CPU liegt bei 100 Prozent. Brauchen wir mehr Kerne?

Vielleicht. Prüfen Sie zuerst, welche Abfragen die CPU verbrauchen. Verteilt sich die Last auf viele effiziente Abfragen und steht die Warteschlange je Scheduler dauerhaft hoch, helfen mehr Kerne. Dominieren wenige teure Abfragen, ist deren Verbesserung der stärkere Hebel.

Die CPU ist niedrig, trotzdem ist es langsam. Was nun?

Dann wartet die Arbeit meist auf etwas anderes: Sperren, Speicher, Platte, Netzwerk oder die Anwendung selbst. Mehr Kerne ändern daran nichts. Welche Wartezeiten dahinterstecken, zeigt der Ratgeber.

Sollen wir Hyperthreading ausschalten?

Das lässt sich nicht pauschal beantworten. Ein Hyperthread ist kein zweiter vollständiger Kern; wie viel er bringt, hängt von Prozessor und Last ab. In unserem Labor machte es keinen messbaren Unterschied, ob vier virtuelle CPUs innerhalb der virtuellen Maschine als Paare oder getrennt lagen; wie der Host sie auf seine Kerne verteilt, sehen wir von dort aus nicht. Für eine Entscheidung braucht es eine Messung auf Ihrer Plattform.

Wie viele Kerne braucht unser SQL Server?

So viele, wie Ihre effiziente Last in Spitzenzeiten tatsächlich nutzt, mit Reserve für Wachstum. Das lässt sich aus der Ausführungshistorie über einige Wochen ableiten, nicht aus einer Momentaufnahme.

Methode und Grenzen

Alle Messwerte stammen aus unserer Laborreihe vom 23.10.2026: SQL Server 2022 CU27 Developer in einem Linux-Container, virtuelle CPUs unter Hyper-V auf einem Intel Xeon mit 2,4 GHz, alle zugewiesenen CPUs in einem NUMA-Knoten, 6 GiB maximaler SQL-Speicher. Synthetische Daten mit 10 Millionen Zeilen im Arbeitsspeicher, gleiche Statistiken. Jede Variante lief nach einer Aufwärmphase in fünf Messfenstern; angegeben sind Mediane. Varianten, deren Fenster mehr als zehn Prozent voneinander abwichen, haben wir mit längeren Fenstern wiederholt. Der Lastgenerator lief auf getrennten CPUs und war nie der Engpass.

Das ist ein Labor, kein Kundenbetrieb. Die Taktfrequenz haben wir nicht verändert; Aussagen über schnellere Kerne sind Schlussfolgerungen aus der seriellen Messung. Die Kurve über 8 Kerne hinaus gilt für diesen Host. Zwei Varianten mit wenigen dauerhaft aktiven Sitzungen streuten stark, weil Abfragen ungleich auf die Scheduler verteilt waren; sie sind nur als Hinweis verwendet. Für die Variante mit 8 Kernen in Versuch 3 lagen die Mediane zweier Messreihen eng beieinander, die Streuung innerhalb einer Reihe aber über zehn Prozent.

So machen wir das Welche Abfragen die CPU tatsächlich verbrauchen und welche parallel laufen, ohne schneller fertig zu werden, werten unsere Engineers mit PSG QX aus dem vorhandenen Query Store aus, über Wochen statt aus einer Momentaufnahme. Mehr zu PSG QX

SQL Server Health Check

Wir helfen bei der Entscheidung

Im SQL Server Health Check prüfen wir unter „Edition und Cores“, ob Ihre Last die vorhandenen Kerne sinnvoll nutzt und wo der Engpass tatsächlich liegt. Für die Planung neuer Hardware ordnen wir Kernzahl und Edition aus Ihrer Sicht ein, siehe Infrastruktur und Hochverfügbarkeit.

Weiterlesen