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