Freigeben über


Bewährte Methoden für Abfragespeicherhinweise

Gilt für: SQL Server 2022 (16.x) und höhere Versionen Azure SQL DatabaseAzure SQL Managed InstanceSQL-Datenbank in Microsoft Fabric

In diesem Artikel werden bewährte Methoden für die Verwendung von Abfragespeicherhinweisen erläutert. Mit Abfragespeicher-Hinweisen können Sie die Formen von Abfrageplänen gestalten, ohne den Anwendungscode ändern zu müssen.

Anwendungsfälle für Abfragespeicherhinweise

Betrachten Sie die folgenden Anwendungsfälle als ideal für Abfragespeicherhinweise. Weitere Informationen finden Sie unter Wann sollten Abfragespeicherhinweise verwendet werden?.

Caution

Da der SQL Server-Abfrageoptimierer in der Regel den besten Ausführungsplan für eine Abfrage auswählt, wird empfohlen, dass nur erfahrene Entwickler und Datenbankadministratoren Hinweise verwenden, wenn alle anderen Möglichkeiten sich als unbefriedigend erwiesen haben. Weitere Informationen finden Sie unter Abfragehinweise.

Wenn Code nicht geändert werden kann

Mit Abfragespeicherhinweisen können Sie die Ausführungspläne von Abfragen beeinflussen, ohne den Anwendungscode oder Datenbankobjekte ändern zu müssen. Mit keinem anderen Feature können Sie Abfragehinweise schnell und einfach anwenden.

Sie können Abfragespeicherhinweise verwenden, z. B. zur Optimierung von ETL-Workloads (Extract-Transform-Load), ohne den Code neu bereitstellen zu müssen. In diesem 14-minütigen Video erfahren Sie, wie Sie das Massendatenladen mit Query Store-Hinweisen verbessern:

Abfragespeicherhinweise sind einfache Abfrageoptimierungsmethoden, aber wenn eine Abfrage problematisch wird, sollte sie mit weiter gehenden Codeänderungen behoben werden. Wenn Sie regelmäßig Abfragespeicherhinweise auf eine Abfrage anwenden müssen, sollten Sie in Betracht ziehen, sie in größerem Umfang neu zu schreiben. Der SQL Server-Abfrageoptimierer wählt in der Regel den besten Ausführungsplan für eine Abfrage aus. Es wird empfohlen, nur Hinweise als letztes Mittel für erfahrene Entwickler und Datenbankadministratoren zu verwenden.

Informationen dazu, welche Abfragehinweise angewendet werden können, finden Sie unter Unterstützte Abfragehinweise.

Unter hoher Transaktionslast oder mit unternehmenskritischem Code

Wenn Codeänderungen aufgrund hoher Anforderungen an die Betriebszeit oder der Transaktionslast nicht praktikabel sind, können Query Store-Hinweise schnell Abfragehinweise auf vorhandene Abfrageworkloads anwenden. Das Hinzufügen und Entfernen von Query Store-Hinweisen ist einfach.

Abfragespeicherhinweise können in Abfragebatches hinzugefügt und entfernt werden, um die Leistung für Zeitfenster anzupassen, die für Bursts mit außergewöhnlicher Workload vorgesehen sind.

Als Ersatz für Plananleitungen

Vor Abfragespeicherhinweisen waren Fachkräften in der Entwicklung für ähnliche Aufgaben auf Planhinweislisten angewiesen, deren Verwendung komplex sein kann. Abfragespeicherhinweise sind mit Abfragespeicherfeatures von SQL Server Management Studio (SSMS) integriert, um Abfragen visuell zu durchsuchen.

Bei Planhinweislisten ist das Durchsuchen aller Pläne mit Abfrageausschnitten erforderlich. Das Feature Abfragespeicherhinweise erfordert keine genau übereinstimmenden Abfragen, um sich auf den resultierenden Abfrageplan auszuwirken. Abfragespeicherhinweise können auf eine query_id im Abfragespeicher-Dataset angewendet werden.

Abfragespeicherhinweise überschreiben hartcodierte Hinweise auf Anweisungsebene sowie vorhandene Planhinweislisten.

Erwägen Sie einen neueren Kompatibilitätsgrad

Abfragespeicherhinweise können eine wertvolle Methode sein, wenn ein neuerer Datenbank-Kompatibilitätsgrad aufgrund von Herstellerspezifikationen oder größeren Testverzögerungen nicht verfügbar ist. Wenn ein höherer Kompatibilitätsgrad für eine Datenbank verfügbar ist, sollten Sie ein Upgrade des Datenbank-Kompatibilitätsgrads einer einzelnen Abfrage durchführen, um die neuesten Leistungsoptimierungen und Features von SQL Server zu nutzen.

Wenn Sie beispielsweise über eine SQL Server 2022 (16.x) Instance mit einer Datenbank in Kompatibilitätsebene 140 verfügen, können Sie weiterhin Abfragespeicher-Hinweise verwenden, um einzelne Abfragen in Kompatibilitätsebene 160 auszuführen. Sie können dazu den folgenden Hinweis verwenden:

EXECUTE sys.sp_query_store_set_hints
    @query_id = 39,
    @query_hints = N'OPTION(USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_160''))';

Für ein vollständiges Tutorial siehe Beispiele für Query Store-Hinweise.

Berücksichtigen einer älteren Kompatibilitätsebene nach dem Upgrade

Ein weiterer Fall, bei dem Abfragespeicherhinweise helfen können, ist, dass Abfragen nach einer SQL Server-Instanzmigration oder einem Upgrade nicht direkt geändert werden können. Verwenden Sie Abfragespeicher-Hinweise, um eine vorherige Kompatibilitätsebene für eine Abfrage anzuwenden, bis sie neu geschrieben oder anderweitig adressiert werden kann, um eine gute Leistung in der neuesten Kompatibilitätsebene zu erreichen. Identifizieren Sie zurückgestellte Ausreißerabfragen mit einer höheren Kompatibilitätsebene mithilfe des Abfragespeicherberichts zu zurückgestellten Abfragen, mit dem Abfrageoptimierungs-Assistent (während einer Migration) oder mit anderen Telemetriedaten auf Abfrageebene. Weitere Informationen zu den Unterschieden zwischen Kompatibilitätsebenen finden Sie unter Unterschiede zwischen Kompatibilitätsebenen.

Nachdem Sie den Leistungstest bei der neuen Kompatibilitätsebene durchgeführt und Abfragespeicher-Hinweise auf diese Weise bereitgestellt haben, können Sie die Kompatibilitätsebene der gesamten Datenbank aktualisieren und gleichzeitig wichtige problematische Abfragen auf der vorherigen Kompatibilitätsebene beibehalten, ohne dass Codeänderungen vorgenommen werden müssen.

Blockieren der zukünftigen Ausführung problematischer Abfragen

Sie können den ABORT_QUERY_EXECUTION Abfragehinweis verwenden, um die zukünftige Ausführung bekannter problematischer Abfragen zu blockieren, z. B. nicht benötigte Abfragen, die einen hohen Ressourcenverbrauch verursachen und kritische Anwendungsworkloads beeinflussen.

Note

Der ABORT_QUERY_EXECUTION Abfragehinweis ist nur in Azure SQL-Datenbank, azure SQL Managed InstanceAUTD und SQL Server 2025 (17.x) verfügbar.

Um beispielsweise die zukünftige Ausführung von query_id 39 zu blockieren, führen Sie sys.sp_query_store_set_hints wie folgt aus:

EXECUTE sys.sp_query_store_set_hints
    @query_id = 39,
    @query_hints = N'OPTION (USE HINT (''ABORT_QUERY_EXECUTION''))';

Führen Sie sys.sp_query_store_clear_hints aus, um die Blockierung derselben Abfrage aufzuheben:

EXECUTE sys.sp_query_store_clear_hints @query_id = 39;

Weitere Informationen finden Sie unter Beispiele für Abfragespeicherhinweise.

Es gelten die folgenden Bedingungen:

  • Wenn Sie diesen Hinweis für eine Abfrage angeben, schlägt ein Versuch zum Ausführen der Abfrage mit Fehler 8778, Schweregrad 16, Abfrageausführung wurde abgebrochen, da der ABORT_QUERY_EXECUTION-Hinweis angegeben wurde, fehl.

  • Um die Blockierung einer Abfrage aufzuheben, können Sie den Hinweis löschen, indem Sie den query_id Wert an den @query_id Parameter in der sys.sp_query_store_clear_hints gespeicherten Prozedur übergeben.

    • Diese gespeicherte Prozedur löscht alle Hinweise für eine Abfrage. Wenn Sie vorhandene Hinweise beibehalten möchten, während Sie die Blockierung der Abfrage aufheben, verwenden Sie sys.sp_query_store_set_hints, entfernen Sie den ABORT_QUERY_EXECUTION Hinweis, aber behalten Sie andere Hinweise bei.
  • Sie können Systemansichten verwenden, um Abfragen im Abfragespeicher zu finden, die blockiert sind, wie in der folgenden Beispielabfrage:

    SELECT qsh.query_id,
           q.query_hash,
           qt.query_sql_text
    FROM sys.query_store_query_hints AS qsh
         INNER JOIN sys.query_store_query AS q
             ON qsh.query_id = q.query_id
         INNER JOIN sys.query_store_query_text AS qt
             ON q.query_text_id = qt.query_text_id
    WHERE UPPER(qsh.query_hint_text) LIKE '%ABORT[_]QUERY[_]EXECUTION%';
    
  • Um den query_id Wert abzurufen, muss mindestens eine Abfrageausführung im Abfragespeicher aufgezeichnet werden. Diese Ausführung muss nicht erfolgreich sein. Dies bedeutet, dass die zukünftige Ausführung von abgelaufenen oder abgebrochenen Abfragen blockiert werden kann.

  • Wenn Sie alle Abfragen mit einem bestimmten Abfragehash blockieren oder aufheben müssen, sollten Sie ein Automatisierungsskript verwenden. Beispielsweise ist dbo.sp_query_store_modify_hints_by_query_hash ein Beispiel für eine gespeicherte Prozedur, die entweder die sys.sp_query_store_set_hints oder die sys.sp_query_store_clear_hints gespeicherte Systemprozedur in einer Schleife für alle query_id-Werte aufruft, die einem Abfragehash entsprechen.

  • Wenn eine Abfrage bereits ausgeführt wird, wenn Sie sie blockieren, wird die Ausführung fortgesetzt. Sie können die KILL-Anweisung verwenden, um die Abfrage abzubrechen.

    • Die Ausführung von abgebrochenen Abfragen wird nicht im Abfragespeicher aufgezeichnet. Wenn sich die Abfrage noch nicht im Abfragespeicher befindet, müssen Sie zulassen, dass die Abfrage abgeschlossen oder abgelaufen ist, um eine query_id abzurufen, die Sie blockieren können.
  • Wenn eine Abfrage durch den Hinweis ABORT_QUERY_EXECUTION blockiert wird, werden die Spalten execution_type und execution_type_desc in der Ansicht sys.query_store_runtime_stats jeweils auf 4 und Ausnahme festgelegt.

  • Wie bei allen Abfragespeicher-Hinweisen müssen Sie über die ALTER-Berechtigung für die Datenbank verfügen, um den Hinweis ABORT_QUERY_EXECUTION festzulegen oder zu löschen.

Überlegungen zu Abfragespeicherhinweisen

Berücksichtigen Sie die folgenden Szenarien beim Verwenden von Abfragespeicherhinweisen.

Änderungen bei der Datenverteilung

Planhinweislisten, erzwungene Pläne über den Abfragespeicher und Abfragespeicherhinweise überschreiben die Entscheidungsfindung des Optimierers. Der Abfragespeicherhinweis kann jetzt vorteilhaft sein, wird es künftig aber nicht mehr sein. Wenn ein Abfragespeicherhinweis beispielsweise bei einer Abfrage in früheren Datenverteilungen hilft, kann es kontraproduktiv sein, wenn dmL-Vorgänge im großen Maßstab die Daten ändern. Eine neue Datenverteilung kann dazu führen, dass der Optimierer eine bessere Entscheidung als der Hinweis treffen kann. Dieses Szenario ist die häufigste Folge des Erzwingens des Planverhaltens.

Überprüfen Sie regelmäßig Ihre Query Store-Hinweisstrategie.

Bewerten Sie Ihre vorhandene Strategie zu Abfragespeicherhinweisen in den folgenden Fällen neu:

  • Nach bekannten großen Änderungen bei der Datenverteilung.
  • Wenn sich die für die Datenbank verfügbaren Ressourcen ändern. Beispiel: Wenn sich die Berechnungsgröße Ihrer Azure SQL-Datenbank, sql Managed Instance oder des virtuellen SQL Server-Computers ändert.
  • Wo Plankorrekturen schon länger notwendig sind. Abfragespeicherhinweise werden am besten für kurzfristige Korrekturen verwendet.
  • Unerwartete Leistungsregressionen.

Potenzial für umfangreiche Auswirkungen

Hinweise zum Abfragespeicher wirken sich unabhängig von Parametersatz, Quellanwendung, Benutzer oder Resultset auf alle Ausführungen der Abfrage aus. Bei versehentlicher Leistungsregression können Abfragespeicherhinweise, die mit sys.sp_query_store_set_hints erstellt wurden, problemlos mit sys.sp_query_store_clear_hints entfernt werden.

Führen Sie für unternehmenskritische oder vertrauliche Systeme mit entsprechender Sorgfalt Auslastungstests durch, bevor Sie Abfragespeicherhinweise in der Produktion anwenden.

Erzwungene Parametrisierung und der RECOMPILE-Hinweis werden nicht unterstützt

Das Anwenden des RECOMPILE Abfragehinweiss mit Abfragespeicherhinweisen wird nicht unterstützt, wenn die Parameterisierung der Datenbankoption auf FORCED festgelegt ist. Weitere Informationen finden Sie unter Richtlinien für die Verwendung der erzwungenen Parametrisierung.

Der RECOMPILE Hinweis ist nicht mit erzwungener Parameterisierung kompatibel, die auf Datenbankebene festgelegt ist. Wenn die Datenbank die erzwungene Parameterisierung verwendet und der RECOMPILE Hinweis Teil der hinweists-Zeichenfolge ist, die im Abfragespeicher für eine Abfrage festgelegt ist, ignoriert das Datenbankmodul den RECOMPILE Hinweis und wendet andere Hinweise an, wenn angegeben. Darüber hinaus wird ab Juli 2022 in der Azure SQL-Datenbank eine Warnung (Fehlercode 12461) ausgegeben, die besagt, dass der RECOMPILE Hinweis ignoriert wurde.

Informationen dazu, welche Abfragehinweise angewendet werden können, finden Sie unter Unterstützte Abfragehinweise.