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