Hohe CPU- oder Arbeitsspeicherzuweisungen können bei Abfragen erfolgen, die optimierte geschachtelte Schleife oder Batchsortierungen verwenden.
Dieser Artikel hilft Ihnen, das Problem zu beheben, bei dem eine hohe CPU-Auslastung auftritt, wenn Sie Abfragen in SQL Server ausführen.
Gilt für: SQL Server
Ursprüngliche KB-Nummer: 2009160
Problembeschreibung
Wenn Sie Microsoft SQL Server ausführen, die eine stark gleichzeitige Arbeitsauslastung aufweisen, können Sie einige Leistungsprobleme in Abfragen feststellen. Dieses Verhalten kann eine mittlere bis hohe CPU-Auslastung oder extreme Speichererteilungsanforderungen aufweisen.
Möglicherweise treten auch andere Nebeneffekte auf, z. B. OOM-Bedingungen, Speicherdruck für die Plancache-Eviction oder unerwartete RESOURCE_SEMAPHORE Wartezeiten.
Darüber hinaus stellen Sie möglicherweise fest, dass für Abfragepläne für Abfragen, die viel CPU oder Auslastung beanspruchen, das OPTIMIZED-Attribut für einen Geschachtelten Schleifen-Join-Operator auf "True" festgelegt ist.
Ursache
Dieses Problem kann in einigen Fällen auftreten, in denen SQL Server Abfrageprozessor einen optionalen Sortiervorgang zur Verbesserung der Leistung einleitet. Dieser Vorgang wird als "Optimierte geschachtelte Schleife" oder "Batchsortieren" bezeichnet, und der Abfrageoptimierer bestimmt, wann diese Operatoren am besten eingeführt werden sollen. In seltenen Fällen berührt die Abfrage nur wenige Zeilen, aber die Einrichtungskosten für den Sortiervorgang sind so signifikant, dass die Kosten der optimierten geschachtelten Schleife ihre Vorteile zunichte macht. Daher können Sie in diesen Fällen eine langsamere Leistung als erwartet feststellen.
Lösung
Ablaufverfolgungsflags 2340
Um das Problem zu beheben, verwenden Sie die Ablaufverfolgungskennzeichnung 2340, um die Optimierung zu deaktivieren. Das Ablaufverfolgungskennzeichen 2340 weist den Abfrageprozessor an, beim Generieren eines Abfrageplans keinen Sortiervorgang (Batchsortierung) für optimierte verschachtelte Schleifenverknüpfungen zu verwenden. Dies wirkt sich auf die gesamte Instanz aus.
Bevor Sie diese Ablaufverfolgungskennzeichnung aktivieren, können Sie Ihre Anwendungen sorgfältig testen, um sicherzustellen, dass Sie die erwarteten Leistungsvorteile erhalten, wenn Sie diese Optimierung deaktivieren. Dies liegt daran, dass die Sortieroptimierung hilfreich sein kann, wenn die Anzahl der Zeilen, die vom Plan berührt werden, stark zunimmt.
Weitere Informationen finden Sie unter DBCC TRACEON – Trace Flags (Transact-SQL).
Ändern des Codes zur Verwendung des DISABLE_OPTIMIZED_NESTED_LOOP Hinweises
Alternativ können Sie den folgenden Abfragehinweis anwenden, DISABLE_OPTIMIZED_NESTED_LOOP um die Optimierung auf Abfrageebene zu deaktivieren.
SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (USE HINT (DISABLE_OPTIMIZED_NESTED_LOOP));
Weitere Informationen finden Sie unter DISABLE_OPTIMIZED_NESTED_LOOP.
Weitere Informationen
Optionen für den Datenbank-Engine-Dienststart
Gilt für
- SQL Server 2005 bis SQL Server 2019