Hohe CPU- oder Speicherzuteilungen können bei Abfragen auftreten, die eine optimierte geschachtelte Schleife oder Batchsortierreihenfolge 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
Symptome
Wenn Sie Microsoft SQL Server mit einer stark gleichzeitigen Workload betreiben, bemerken Sie möglicherweise einige Leistungsprobleme in Abfragen. Dieses Verhalten kann als mittlere bis hohe CPU-Auslastung oder extreme Speicherzuweisungsanforderungen auftreten.
Es können auch andere Nebenwirkungen auftreten, z. B. OOM-Bedingungen, Arbeitsspeicherauslastung beim Entfernen des Plancaches oder unerwartete RESOURCE_SEMAPHORE
Wartezeiten.
Darüber hinaus können Sie feststellen, dass für Abfragepläne für Abfragen, die viele CPU- oder Speicherressourcen verbrauchen, das OPTIMIZED-Attribut für einen Joinoperator für geschachtelte Schleifen auf True festgelegt ist.
Ursache
Dieses Problem kann in einigen Fällen auftreten, in denen SQL Server Abfrageprozessor einen optionalen Sortiervorgang einführt, um die Leistung zu verbessern. Dieser Vorgang wird als "Optimierte geschachtelte Schleife" oder "Batchsortierung" bezeichnet, und der Abfrageoptimierer bestimmt, wann diese Operatoren am besten eingeführt werden sollten. In seltenen Fällen berührt die Abfrage nur wenige Zeilen, aber die Einrichtungskosten für den Sortiervorgang sind so erheblich, dass die Kosten der optimierten geschachtelten Schleife ihre Vorteile überwiegen. Daher kann es in diesen Fällen zu einer langsameren Leistung im Vergleich zu den Erwartungen führen.
Lösung
Ablaufverfolgungsflag 2340
Um das Problem zu beheben, verwenden Sie das Ablaufverfolgungsflag 2340, um die Optimierung zu deaktivieren. Das Ablaufverfolgungsflag 2340 weist den Abfrageprozessor an, beim Generieren eines Abfrageplans keinen Sortiervorgang (Batchsortierung) für optimierte geschachtelte Schleifenjoins zu verwenden. Dies wirkt sich auf die gesamte instance aus.
Bevor Sie dieses Ablaufverfolgungsflag aktivieren, können Sie Ihre Anwendungen gründlich testen, um sicherzustellen, dass Sie die erwarteten Leistungsvorteile erzielen, 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, erheblich erhöht wird.
Weitere Informationen finden Sie unter DBCC TRACEON – Ablaufverfolgungsflags (Transact-SQL).
Ändern von Code zur Verwendung des DISABLE_OPTIMIZED_NESTED_LOOP-Hinweises
Wenden Sie alternativ den folgenden DISABLE_OPTIMIZED_NESTED_LOOP
Abfragehinweis an, 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
Startoptionen für den Datenbank-Engine-Dienst
Gilt für
- SQL Server 2005 bis SQL Server 2019
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für