Omówienie wskazówek dotyczących zapytań
Wskazówki dotyczące zapytań to opcje lub strategie, które można zastosować w celu wymuszenia procesora zapytań, aby użyć określonego operatora w planie wykonywania instrukcji SELECT, , INSERTUPDATElub DELETE . Wskazówki dotyczące zapytań zastępują dowolny plan wykonywania, który procesor zapytań może wybrać dla danego zapytania z klauzulą OPTION .
W większości przypadków optymalizator zapytań wybiera wydajny plan wykonywania na podstawie indeksów, statystyk i dystrybucji danych. Administratorzy baz danych rzadko muszą interweniować ręcznie.
Plan wykonywania zapytania można zmienić, dodając wskazówki dotyczące zapytań na końcu zapytania. Jeśli na przykład dodasz OPTION (MAXDOP <integer_value>) na końcu zapytania używającego pojedynczego procesora CPU, zapytanie może używać wielu procesorów CPU (równoległość) w zależności od wybranej wartości. Możesz też użyć OPTION (RECOMPILE) polecenia , aby upewnić się, że zapytanie generuje nowy, tymczasowy plan za każdym razem, gdy jest wykonywany.
--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
Chociaż wskazówki dotyczące zapytań mogą stanowić zlokalizowane rozwiązanie różnych problemów związanych z wydajnością, należy unikać używania ich w środowisku produkcyjnym z następujących powodów.
- Posiadanie stałej wskazówki dotyczącej zapytania może prowadzić do zmian strukturalnych w bazie danych, które mogłyby być korzystne, ale nie są już stosowalne do tego zapytania.
- Nie można korzystać z nowych i ulepszonych funkcji w kolejnych wersjach programu SQL Server, jeśli powiążesz zapytanie z określonym planem wykonywania.
Istnieje jednak kilka wskazówek dotyczących zapytań dostępnych w programie SQL Server, które są używane do różnych celów. Omówimy kilka z nich poniżej:
FAST <integer_value>— pobiera pierwszą <integer_value> liczbę wierszy podczas kontynuowania wykonywania zapytania. Działa lepiej z małymi zestawami danych i niską wartością dla szybkiej wskazówki dotyczącej zapytań. W miarę zwiększania liczby wierszy koszt zapytania staje się wyższy.OPTIMIZE FOR— zawiera instrukcje optymalizatora zapytań, że określona wartość zmiennej lokalnej powinna być używana podczas kompilowania i optymalizowania zapytania.USE PLAN— optymalizator zapytań używa planu zapytania określonego przez atrybut xml_plan .RECOMPILE— tworzy nowy, tymczasowy plan zapytania i odrzuca go natychmiast po wykonaniu zapytania.{ LOOP | MERGE | HASH } JOIN— określa, że wszystkie operacje sprzężenia są wykonywane przezLOOP JOIN,MERGE JOINlubHASH JOINw całym zapytaniu. Optymalizator wybiera najmniej kosztowną strategię sprzężenia spośród dostępnych opcji, jeśli określisz więcej niż jedną podpowiedź dotyczącą sprzężenia.MAXDOP <integer_value>— zastępuje wartość maksymalnego stopnia równoległościsp_configure. Zapytanie określające tę opcję zastępuje również zarządcę zasobów.
W tym samym zapytaniu można również zastosować wiele wskazówek dla zapytań. W poniższym przykładzie zastosowano wskazówki zapytań HASH GROUP i FAST <integer_value> w tej samej kwerendzie.
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
Aby dowiedzieć się więcej na temat wskazówek dotyczących zapytań, zobacz Wskazówki (Transact-SQL).
Sugestie dla Query Store
Wskazówki dotyczące magazynu zapytań zapewniają prostą metodę kształtowania planów zapytań bez modyfikowania kodu aplikacji.
Wskazówki dotyczące magazynu zapytań są przydatne, gdy optymalizator zapytań nie generuje wydajnego planu wykonywania, a deweloper lub administrator bazy danych nie może zmodyfikować oryginalnego tekstu zapytania. W niektórych aplikacjach tekst zapytania może być zakodowany na stałe lub wygenerowany automatycznie.
Aby użyć porad dotyczących magazynu zapytań, należy zidentyfikować identyfikator zapytania query_id instrukcji zapytania, którą chcesz zmodyfikować za pomocą widoków katalogowych magazynu zapytań, wbudowanych raportów magazynu zapytań lub analizy wydajności zapytań dla usługi Azure SQL Database. Następnie wykonaj polecenie sp_query_store_set_hints za pomocą ciągu query_id i wskazówki zapytania, które chcesz zastosować do zapytania.
W poniższym przykładzie pokazano, jak uzyskać query_id dla określonego zapytania, a następnie użyć go do zastosowania RECOMPILE wskazówek i MAXDOP wskazówek do zapytania.
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
Istnieje kilka scenariuszy, w których wskazówki Query Store mogą pomóc w rozwiązywaniu problemów z wydajnością na poziomie pojedynczych zapytań.
- Ponownie skompiluj zapytanie przy każdym wykonaniu.
- Ogranicz maksymalny stopień równoległości dla operacji aktualizacji statystyki.
- Użyj sprzężenia haszującego zamiast sprzężenia zagnieżdżonych pętli.
- Użyj poziomu zgodności 110 dla określonego zapytania, zachowując zgodność bazy danych.
Aby uzyskać więcej informacji na temat wskazówek dotyczących magazynu zapytań, zobacz Wskazówki dotyczące magazynu zapytań.