Udostępnij za pomocą


Najlepsze praktyki dotyczące Query Store

Dotyczy: SQL Server 2022 (16.x) i nowsze wersje Azure SQL DatabaseAzure SQL Managed InstanceSQL database w usłudze Microsoft Fabric

W tym artykule przedstawiono najlepsze praktyki dotyczące używania wskazówek dla Magazynu Zapytań . Wskazówki dotyczące magazynu zapytań umożliwiają kształtowanie kształtów planu zapytania bez modyfikowania kodu aplikacji.

Przypadki użycia wskazówek dla Query Store

Rozważ następujące przypadki użycia jako idealne podpowiedzi Query Store. Aby uzyskać więcej informacji, zobacz Kiedy używać wskazówek dotyczących Query Store.

Caution

Ponieważ optymalizator zapytań programu SQL Server zazwyczaj wybiera najlepszy plan wykonania zapytania, zalecamy używanie wskazówek tylko w ostateczności dla doświadczonych deweloperów i administratorów baz danych. Aby uzyskać więcej informacji, zobacz Wskazówki dotyczące zapytań.

Gdy nie można zmienić kodu

Korzystanie z wskazówek magazynu zapytań umożliwia wpływanie na plany wykonywania zapytań bez zmieniania kodu aplikacji lub obiektów bazy danych. Żadna inna funkcja nie umożliwia szybkiego i łatwego stosowania wskazówek dotyczących zapytań.

Możesz użyć wskazówek magazynu zapytań, na przykład, aby korzystać z obciążeń typu wyodrębnianie-przekształcanie-ładowanie (ETL), bez ponownego wdrażania kodu. Dowiedz się, jak ulepszyć ładowanie zbiorcze z pomocą wskazówek Query Store, oglądając to 14-minutowe wideo:

Wskazówki Query Store to lekkie metody dostrajania zapytań, ale jeśli zapytanie stanie się problematyczne, należy zająć się nim poprzez bardziej znaczące zmiany w kodzie. Jeśli regularnie musisz stosować podpowiedzi Query Store do zapytania, rozważ przeredagowanie większego zapytania. Optymalizator zapytań programu SQL Server zazwyczaj wybiera najlepszy plan wykonania zapytania. Zalecamy używanie wskazówek tylko w ostateczności dla doświadczonych deweloperów i administratorów baz danych.

Aby dowiedzieć się, które podpowiedzi dotyczące zapytań można zastosować, zobacz Obsługiwane podpowiedzi dotyczące zapytań.

W przypadku dużego obciążenia transakcji lub kodu o znaczeniu krytycznym

Jeśli zmiany kodu są niepraktyczne z powodu wysokich wymagań dotyczących dostępności lub obciążenia transakcyjnego, podpowiedzi Magazynu Zapytań mogą szybko zastosować podpowiedzi dotyczące zapytań do istniejących obciążeń zapytań. Dodawanie i usuwanie wskazówek Query Store jest łatwe.

Wskazówki dotyczące przechowywania zapytań można dodawać do partii i usuwać z partii zapytań w celu optymalizacji wydajności w oknach czasowych zaplanowanych na okresy wyjątkowego obciążenia.

Jako zamiennik instrukcji planu

Przed wprowadzeniem wskazówek Query Store deweloper musiałby polegać na przewodnikach planu do wykonywania podobnych zadań, które mogą być złożone w użyciu. Wskazówki dotyczące magazynu zapytań są zintegrowane z funkcjami magazynu zapytań programu SQL Server Management Studio (SSMS) w celu wizualnego eksplorowania zapytań.

W przypadku przewodników dotyczących planu konieczne jest przeszukiwanie wszystkich planów przy użyciu fragmentów zapytań. Funkcja wskazówek magazynu zapytań nie wymaga dokładnego dopasowania zapytań, aby wpłynąć na wynikowy plan zapytania. Wskazówki magazynu zapytań można zastosować do query_id w bazie danych magazynu zapytań.

Podpowiedzi magazynu zapytań zastępują zakodowane na stałe podpowiedzi na poziomie instrukcji oraz istniejące wskazówki dotyczące planu.

Rozważ nowszy poziom zgodności

Wskazówki dotyczące Query Store mogą być cenną metodą, gdy nowszy poziom zgodności bazy danych nie jest dostępny ze względu na specyfikację dostawcy lub większe opóźnienia w testowaniu, na przykład. Jeśli dla bazy danych jest dostępny wyższy poziom zgodności, rozważ uaktualnienie poziomu zgodności bazy danych pojedynczego zapytania, aby skorzystać z najnowszych optymalizacji wydajności i funkcji programu SQL Server.

Jeśli na przykład masz wystąpienie programu SQL Server 2022 (16.x) z bazą danych na poziomie zgodności 140, nadal możesz używać podpowiedzi Query Store, aby uruchamiać poszczególne zapytania na poziomie zgodności 160. Możesz użyć następującej wskazówki:

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

Aby uzyskać kompletny samouczek, zobacz Wskazówki dotyczące magazynu zapytań Przykłady.

Rozważ starszy poziom zgodności po uaktualnieniu

Innym przypadkiem, w którym podpowiedzi Query Store mogą pomóc, jest sytuacja, gdy zapytania nie mogą być modyfikowane bezpośrednio po migracji lub uaktualnieniu wystąpienia programu SQL Server. Użyj wskazówek magazynu zapytań, aby zastosować poprzedni poziom zgodności dla zapytania, dopóki nie będzie można go przepisać lub w inny sposób zaadresować w celu zapewnienia dobrego działania na najnowszym poziomie zgodności. Identyfikowanie zapytań odstających, które zareagowały regresją przy wyższym poziomie zgodności, przy użyciu raportu zapytań z regresją w magazynie zapytań, przy pomocy narzędzia Asystent Dostrajania Zapytania podczas migracji lub innych danych telemetrycznych związanych z zapytaniami. Aby uzyskać więcej informacji na temat różnic między poziomami zgodności, zapoznaj się z Różnice między poziomami zgodności.

Po przetestowaniu wydajności nowego poziomu zgodności i wdrożeniu wskazówek magazynu zapytań w ten sposób można uaktualnić poziom zgodności całej bazy danych, zachowując jednocześnie kluczowe problematyczne zapytania na poprzednim poziomie zgodności bez żadnych zmian w kodzie.

Blokuj przyszłe wykonywanie problematycznych zapytań

Możesz użyć ABORT_QUERY_EXECUTION wskazówki dotyczącej zapytania, aby zablokować przyszłe wykonywanie znanych problematycznych zapytań, na przykład zapytania bezskuteiczne powodujące wysokie użycie zasobów i wpływające na krytyczne obciążenia aplikacji.

Note

Wskazówka dotycząca zapytania ABORT_QUERY_EXECUTION jest dostępna tylko w usługach Azure SQL Database, Azure SQL Managed InstanceAUTD i SQL Server 2025 (17.x).

Aby na przykład zablokować przyszłe wykonanie 39, wykonaj query_id w następujący sposób:

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

Aby odblokować to samo zapytanie, wykonaj sys.sp_query_store_clear_hints:

EXECUTE sys.sp_query_store_clear_hints @query_id = 39;

Aby uzyskać więcej informacji, zobacz przykłady wskazówek Query Store.

Obowiązują następujące zastrzeżenia:

  • Po określeniu tej wskazówki dla zapytania próba wykonania zapytania kończy się niepowodzeniem z powodu błędu 8778, ważność 16, wykonanie zapytania zostało przerwane, ponieważ określono wskazówkę ABORT_QUERY_EXECUTION.

  • Aby odblokować zapytanie, możesz wyczyścić wskazówkę, przekazując wartość query_id do parametru @query_id w składowanej procedurze sys.sp_query_store_clear_hints.

    • Ta procedura składowana czyści wszystkie wskazówki dotyczące zapytania. Jeśli chcesz zachować istniejące wskazówki podczas odblokowywania zapytania, użyj sys.sp_query_store_set_hints, usuwając ABORT_QUERY_EXECUTION wskazówkę, ale zachowując inne wskazówki.
  • Za pomocą widoków systemowych można znaleźć zapytania w magazynie zapytań, które są blokowane, jak w poniższym przykładowym zapytaniu:

    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%';
    
  • Aby uzyskać wartość query_id, co najmniej jedno wykonanie zapytania musi być zarejestrowane w Query Store. To wykonanie nie musi zakończyć się pomyślnie. Oznacza to, że przyszłe wykonanie zapytań, które wygasły lub zostały anulowane, może zostać zablokowane.

  • Jeśli musisz zablokować lub odblokować wszystkie zapytania z określonym skrótem zapytania, rozważ użycie skryptu automatyzacji. Na przykład dbo.sp_query_store_modify_hints_by_query_hash to przykładowa procedura składowana, która wywołuje w pętli procedurę składowaną systemu sys.sp_query_store_set_hints lub sys.sp_query_store_clear_hints dla wszystkich wartości query_id pasujących do skrótu zapytania.

  • Jeśli zapytanie jest już wykonywane podczas blokowania go, jego wykonanie będzie kontynuowane. Aby przerwać zapytanie, możesz użyć instrukcji KILL .

    • Wykonywanie przerwanych zapytań nie jest rejestrowane w Magazynie Zapytań. Jeśli zapytanie nie znajduje się jeszcze w magazynie zapytań, musisz pozwolić na jego zakończenie lub przekroczenie limitu czasu, aby uzyskać query_id, który możesz zablokować.
  • Gdy zapytanie jest blokowane przez ABORT_QUERY_EXECUTION wskazówkę, kolumny execution_type i execution_type_desc w widoku sys.query_store_runtime_stats są ustawione odpowiednio na 4 i Wyjątek.

  • Podobnie jak w przypadku wszystkich podpowiedzi Query Store, musisz mieć ALTER uprawnienie do bazy danych, aby ustawić i usunąć ABORT_QUERY_EXECUTION podpowiedź.

Uwagi dotyczące wskazówek dla Magazynu Zapytań

Podczas wdrażania wskazówek Query Store należy wziąć pod uwagę następujące scenariusze.

Zmiany dystrybucji danych

Przewodniki planów, wymuszone plany poprzez Magazyn Zapytań i wskazówki Magazynu Zapytań zastępują podejmowanie decyzji optymalizatora. Podpowiedź Query Store może być obecnie korzystna, ale niekoniecznie w przyszłości. Jeśli na przykład wskazówka dotycząca magazynu zapytań pomaga w zapytaniu w poprzedniej dystrybucji danych, może to być sprzeczne z wydajnością, jeśli operacje DML na dużą skalę zmieniają dane. Nowa dystrybucja danych może spowodować, że optymalizator podejmie lepszą decyzję niż wskazówka. Ten scenariusz jest najczęstszą konsekwencją wymuszania zachowania planu.

Regularnie ponownie oceniaj swoją strategię podpowiedzi Query Store

Ponownie oceń swoją obecną strategię podpowiedzi w Query Store w następujących sytuacjach:

  • Po wystąpieniu znanych zmian dużego rozkładu danych.
  • Gdy zasoby dostępne dla bazy danych zmienią się. Na przykład, gdy zmienia się rozmiar obliczeniowy usługi Azure SQL Database, wystąpienia zarządzanego SQL lub maszyny wirtualnej SQL Server.
  • Gdzie ustalanie planu stało się długotrwałe. Wskazówki dotyczące Query Store najlepiej nadają się do krótkoterminowych rozwiązań.
  • Nieoczekiwane regresje wydajności.

Szeroki potencjał wpływu

Wskazówki dotyczące magazynu zapytań mają wpływ na wszystkie wykonania zapytania, niezależnie od zestawu parametrów, aplikacji źródłowej, użytkownika lub zestawu wyników. W przypadku niezamierzonej regresji wydajności wskazówki magazynu zapytań utworzone za pomocą sys.sp_query_store_set_hints można łatwo usunąć za pomocą sys.sp_query_store_clear_hints.

Przed zastosowaniem podpowiedzi magazynu zapytań w środowisku produkcyjnym należy uważnie przeprowadzić zmiany związane z testowaniem obciążeniowym dla systemów o znaczeniu krytycznym lub poufnym.

Wymuszona parametryzacja i wskazówka RECOMPILE nie są obsługiwane

RECOMPILE Zastosowanie wskazówki zapytania z wskazówkami Query Store nie jest obsługiwane, gdy opcja bazy danych PARAMETRYZACJA jest ustawiona na WYMUSZONE. Aby uzyskać więcej informacji, zobacz Wytyczne dotyczące stosowania wymuszonej parametryzacji.

RECOMPILE Wskazówka nie jest zgodna z wymuszoną parametryzacją ustawioną na poziomie bazy danych. Jeśli baza danych używa wymuszonej parametryzacji, a RECOMPILE wskazówka jest częścią ciągu wskazówek ustawionych w Query Store dla zapytania, aparat bazy danych ignoruje RECOMPILE wskazówkę i stosuje inne wskazówki, jeśli określono. Ponadto, począwszy od lipca 2022 r. w usłudze Azure SQL Database, zostanie wyświetlone ostrzeżenie (kod błędu 12461) z informacją, że RECOMPILE wskazówka została zignorowana.

Aby dowiedzieć się, które podpowiedzi dotyczące zapytań można zastosować, zobacz Obsługiwane podpowiedzi dotyczące zapytań.