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 beim Ausführen von Abfragen in SQL Server eine hohe CPU-Auslastung auftritt.
Gilt für: SQL Server
Ursprüngliche KB-Nummer: 2009160
Problembeschreibung
Wenn Sie Microsoft SQL Server mit einer stark gleichzeitigen Arbeitsauslastung betreiben, stellen Sie möglicherweise einige Leistungsprobleme in Abfragen fest. Dieses Verhalten kann als mittlere bis hohe CPU-Auslastung oder extreme Speicherzuteilungsanforderungen auftreten.
Es können auch andere Nebenwirkungen auftreten, z. B. OOM-Bedingungen, Speicherdruck für die Cacheräumung oder unerwartete Wartezeiten.You may also experience other side effects, such as OOM conditions, memory pressure for plan cache eviction, or unexpected RESOURCE_SEMAPHORE
waits.
Darüber hinaus stellen Sie möglicherweise fest, dass Abfragepläne für Abfragen, die viele CPU oder Speicher verbrauchen, das OPTIMIZED-Attribut für einen Verknüpfungsoperator mit geschachtelten Schleifen auf "True" festgelegt haben.
Ursache
Dieses Problem kann in einigen Fällen auftreten, in denen der 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 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 überwiegen. Daher können Sie in diesen Fällen eine langsamere Leistung im Vergleich zu den erwarteten Werten beobachten.
Lösung
Ablaufverfolgungskennzeichnung 2340
Verwenden Sie zum Beheben des Problems das Ablaufverfolgungskennzeichnung 2340, um die Optimierung zu deaktivieren. Das Ablaufverfolgungskennzeichnung 2340 weist den Abfrageprozessor an, beim Generieren eines Abfrageplans keinen Sortiervorgang (Batchsortierung) für optimierte geschachtelte Schleifenverknürungen zu verwenden. Dies wirkt sich auf die gesamte Instanz aus.
Bevor Sie dieses Ablaufverfolgungskennzeichnung aktivieren, können Sie Ihre Anwendungen gründlich testen, um sicherzustellen, dass Sie die erwarteten Leistungsvorteile erhalten, wenn Sie diese Optimierung deaktivieren. Dies liegt daran, dass die Sortieroptimierung hilfreich sein kann, wenn eine große Erhöhung der Anzahl von Zeilen besteht, die vom Plan berührt werden.
Weitere Informationen finden Sie unter DBCC TRACEON – Trace Flags (Transact-SQL).For more information, see DBCC TRACEON - Trace Flags (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