Grundlegendes zu Abfragehinweisen

Abgeschlossen

Abfragehinweise sind Optionen oder Strategien, die angewendet werden können, um den Abfrageprozessor zu veranlassen, einen bestimmten Operator im Ausführungsplan für SELECT, INSERT, UPDATE oder DELETE Anweisungen zu verwenden. Abfragehinweise setzen jeden Ausführungsplan außer Kraft, den der Abfrageprozessor für eine bestimmte Abfrage mit der OPTION Klausel auswählen kann.

In den meisten Fällen wählt der Abfrageoptimierer basierend auf den Indizes, Statistiken und Datenverteilungen einen effizienten Ausführungsplan aus. Datenbankadministratoren müssen selten manuell eingreifen.

Sie können den Ausführungsplan der Abfrage ändern, indem Sie Abfragehinweise am Ende der Abfrage hinzufügen. Wenn Sie z. B. am Ende einer Abfrage hinzufügen OPTION (MAXDOP <integer_value>) , die eine einzelne CPU verwendet, kann die Abfrage je nach gewähltem Wert mehrere CPUs (Parallelität) verwenden. Oder Sie können OPTION (RECOMPILE) verwenden, um sicherzustellen, dass die Abfrage bei jeder Ausführung einen neuen, temporären Plan generiert.

--With maxdop hint
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total  
FROM Sales.SalesOrderDetail  
WHERE UnitPrice < $5.00  
GROUP BY ProductID, OrderQty  
ORDER BY ProductID, OrderQty  
OPTION (MAXDOP 2)
GO

--With recompile hint
SELECT City
FROM Person.Address
WHERE StateProvinceID=15 OPTION (RECOMPILE)
GO

Obwohl Abfragehinweise möglicherweise eine lokalisierte Lösung für verschiedene leistungsbezogene Probleme bereitstellen, sollten Sie diese aus den folgenden Gründen nicht in der Produktionsumgebung verwenden.

  • Die Verwendung eines permanenten Abfragehinweises für Ihre Abfrage kann dazu führen, dass strukturelle Datenbankänderungen, die für die Abfrage von Vorteil wären, nicht anwendbar sind.
  • Sie können nicht von neuen und verbesserten Features in nachfolgenden Versionen von SQL Server profitieren, wenn Sie eine Abfrage an einen bestimmten Ausführungsplan binden.

Es gibt jedoch mehrere Abfragehinweise für SQL Server, die für unterschiedliche Zwecke verwendet werden. Lassen Sie uns einige davon unten besprechen:

  • FAST <integer_value>– ruft die erste <integer_value> Anzahl von Zeilen ab, während die Abfrageausführung fortgesetzt wird. Es funktioniert besser mit kleinen Datensätzen und geringem Wert für schnelle Abfragehinweise. Da die Zeilenanzahl erhöht wird, werden die Abfragekosten höher.

  • OPTIMIZE FOR– enthält Anweisungen für den Abfrageoptimierer, dass ein bestimmter Wert für eine lokale Variable verwendet werden soll, wenn eine Abfrage kompiliert und optimiert wird.

  • USE PLAN— Der Abfrageoptimierer verwendet einen vom xml_plan Attribut angegebenen Abfrageplan.

  • RECOMPILE– erstellt einen neuen, temporären Plan für die Abfrage und verwirft sie unmittelbar nach der Ausführung der Abfrage.

  • { LOOP | MERGE | HASH } JOIN– gibt an, dass alle Verknüpfungsvorgänge von LOOP JOIN, MERGE JOIN oder HASH JOIN in der gesamten Abfrage ausgeführt werden. Der Optimierer wählt die am wenigsten teure Verknüpfungsstrategie aus den Optionen aus, wenn Sie mehrere Join-Hinweise angeben.

  • MAXDOP <integer_value>— überschreibt den maximalen Grad des Parallelismuswerts von sp_configure. Die Abfrage, die diese Option angibt, setzt auch Resource Governor außer Kraft.

Sie können auch mehrere Abfragehinweise in derselben Abfrage anwenden. Im folgenden Beispiel werden die HASH GROUP- und die FAST <integer_value>-Abfragehinweise in derselben Abfrage verwendet.

SELECT ProductID, OrderQty, SUM(LineTotal) AS Total  
FROM Sales.SalesOrderDetail  
WHERE UnitPrice < $5.00  
GROUP BY ProductID, OrderQty  
ORDER BY ProductID, OrderQty  
OPTION (HASH GROUP, FAST 10);  
GO    

Weitere Informationen zu Abfragehinweisen finden Sie unter "Hinweise(Transact-SQL)".

Grundlegendes zum Abfragespeicher

Abfragespeicherhinweise stellen eine einfache Methode zum Gestalten von Abfrageplänen bereit, ohne den Anwendungscode zu ändern.

Abfragespeicherhinweise sind nützlich, wenn der Abfrageoptimierer keinen effizienten Ausführungsplan generiert, und wenn der Entwickler oder DBA den ursprünglichen Abfragetext nicht ändern kann. In einigen Anwendungen kann der Abfragetext hartcodiert oder automatisch generiert werden.

Screenshot: Funktionsweise von Abfragespeicherhinweisen

Um Abfragespeicherhinweise zu verwenden, müssen Sie die query_id der Abfrageanweisung identifizieren, die Sie über Abfragespeicherkatalogansichten, integrierte Abfragespeicherberichte oder Query Performance Insight in Azure SQL-Datenbank ändern möchten. Führen Sie dann sp_query_store_set_hints mit der query_id und der Abfragehinweis-Zeichenfolge aus, die Sie auf die Abfrage anwenden möchten.

Im folgenden Beispiel wird gezeigt, wie Sie das query_id für eine spezifische Abfrage erhalten und es dann verwenden, um die RECOMPILE und MAXDOP Hinweise auf die Abfrage anzuwenden.

SELECT q.query_id, qt.query_sql_text
FROM sys.query_store_query_text qt 
    INNER JOIN sys.query_store_query q 
        ON qt.query_text_id = q.query_text_id 
WHERE query_sql_text like N'%ORDER BY CustomerName DESC%'  
  AND query_sql_text not like N'%query_store%'
GO

--Assuming the query_id returned by the previous query is 42
EXEC sys.sp_query_store_set_hints @query_id= 42, @query_hints = N'OPTION(RECOMPILE, MAXDOP 1)'
GO

Es gibt einige Szenarien, in denen Abfragespeicherhinweise bei Leistungsproblemen auf der Abfrageebene hilfreich sein können.

  • Erneutes Kompilieren einer Abfrage bei jeder Ausführung
  • Beschränken Sie den maximalen Grad der Parallelität für einen Statistikaktualisierungsvorgang.
  • Verwenden Sie einen Hash Join anstelle eines Nested Loops Join.
  • Verwenden Sie Kompatibilitätsebene 110 für eine bestimmte Abfrage, während die Datenbank auf der aktuellen Kompatibilitätsebene belassen wird.

Weitere Informationen zu Abfragespeicherhinweisen finden Sie unter Abfragespeicherhinweise.