Query Hints (Transact-SQL)

Wskazówki dotyczące kwerendy określają, że w całej kwerendzie powinny być używane podane wskazówki.Wskazówki dotyczące kwerendy wpływają na wszystkie operatory w instrukcji.Jeśli kwerenda główna wykonuje operację UNION, wówczas tylko ostatnia kwerenda wykonująca operację UNION może zawierać klauzulę OPTION.Wskazówki dotyczące kwerendy określa się jako część klauzuli OPTION.Jeśli przynajmniej jedna ze wskazówek dotyczących kwerendy powoduje, że optymalizator kwerendy nie generuje prawidłowego planu, zgłaszany jest błąd 8622.

Ostrzeżenie

Ponieważ SQL Server optymalizator kwerendy wybiera zazwyczaj najlepszym plan wykonania kwerendy, zaleca się tylko przy użyciu wskazówek w ostateczności dla doświadczonych programistów i administratorów bazy danych.

Nie buforuj wszystkie dane z błędu przekazywania.

USUWANIE

Aby wyświetlić właściwości operator plan wykonania

WYBIERZ OPCJĘ

AKTUALIZACJA

KORESPONDENCJI SERYJNEJ

Topic link iconKonwencje składni języka Transact-SQL

<query_hint > ::= 
{ { HASH | ORDER } GROUP 
  | { CONCAT | HASH | MERGE } UNION 
  | { LOOP | MERGE | HASH } JOIN 
  | FAST number_rows 
  | FORCE ORDER 
  | MAXDOP number_of_processors 
  | OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )
  | OPTIMIZE FOR UNKNOWN
  | PARAMETERIZATION { SIMPLE | FORCED }
  | RECOMPILE
  | ROBUST PLAN 
  | KEEP PLAN 
  | KEEPFIXED PLAN
  | EXPAND VIEWS 
  | MAXRECURSION number 
  | USE PLAN N'xml_plan'
  | TABLE HINT ( exposed_object_name  [ , <table_hint> [ [, ]...n ] ] )
<table_hint> ::=
[ NOEXPAND ] { 
    INDEX ( index_value [ ,...n ] ) | INDEX = ( index_value )
  | FASTFIRSTROW 
  | FORCESEEK
  | HOLDLOCK 
  | NOLOCK 
  | NOWAIT
  | PAGLOCK 
  | READCOMMITTED 
  | READCOMMITTEDLOCK 
  | READPAST 
  | READUNCOMMITTED 
  | REPEATABLEREAD 
  | ROWLOCK 
  | SERIALIZABLE 
  | TABLOCK 
  | TABLOCKX 
  | UPDLOCK 
  | XLOCK 
}

Argumenty

  • { HASH | ORDER } GROUP
    Przed zmianą konfiguracja okna pamięci podręcznej, należy wyłączyć moduł zbierający dane.

  • Ta procedura przechowywana kończy się niepowodzeniem, jeśli włączono modułów zbierających dane.
    Określa, że wszystkie operacje UNION są wykonywane przez scalanie, mieszanie lub łączenie zestawów UNION.W przypadku określenia wielu wskazówek UNION optymalizator kwerendy wybiera spośród nich strategię najmniej kosztowną.

  • Identyfikator GUID pakiet.
    Określa, że wszystkie operacje sprzęgania są wykonywane w całej kwerendzie za pomocą instrukcji LOOP JOIN, MERGE JOIN lub HASH JOIN.W przypadku określenia wielu sprzężeń optymalizator wybiera spośród dozwolonych strategii sprzęgania najmniej kosztowną.

    Jeśli w tej samej kwerendzie jedna ze wskazówek dotyczących kwerendy jest również określona w klauzuli FROM dla określonej pary tabel, wskazówka ta ma pierwszeństwo w sprzęganiu tych dwóch tabel, lecz nadal muszą być honorowane inne wskazówki dotyczące kwerendy.Dlatego wskazówka dotycząca kwerendy dla pary tabel może jedynie ograniczać wybór dozwolonych metod sprzęgania we wskazówce dotyczącej kwerendy.Aby uzyskać więcej informacji, zobacz Join Hints (Transact-SQL).

  • ownersidnumber_rows
    Określa, że kwerenda jest zoptymalizowany pod kątem szybkiego pobierania pierwszego number_rows. Jest to nieujemna liczba całkowita. Po pierwszym number_rows są zwracane, kwerenda kontynuuje wykonywanie i powoduje jego zestaw wyników pełny.

  • packagedata
    Określa, że kolejność sprzęgania wskazana przez składnię kwerendy jest zachowywana podczas optymalizacji kwerendy.Użycie wskazówki FORCE ORDER nie wpływa na możliwe zachowanie optymalizatora kwerendy polegające na odwróceniu roli.Aby uzyskać więcej informacji, zobacz Understanding Hash Joins.

    Uwaga

    W instrukcji MERGE, zgodnie z domyślną kolejnością sprzęgania, najpierw jest uzyskiwany dostęp do tabeli źródłowej, a następnie do tabeli docelowej, chyba że określono klauzulę WHEN SOURCE NOT MATCHED.Określenie wskazówki FORCE ORDER nie powoduje zmiany tego zachowania domyślnego.

    Aby uzyskać informacje dotyczące sposobu SQL Server optymalizator kwerendy wymusza wskazówka FORCE ORDER podczas kwerendy zawiera widok, zobacz Wyświetl rozwiązanie.

  • Klient, który utworzony pakiet.number
    Powoduje zastąpienie opcji konfiguracji maksymalnego stopnia równoległości procedury sp_configure i modułu zarządzania zasobami dla kwerendy określającej tę opcję.Wskazówka MAXDOP dotycząca kwerendy może spowodować przekroczenie wartości skonfigurowanej za pomocą procedury sp_configure.Jeśli wskazówka MAXDOP powoduje przekroczenie wartości skonfigurowanej za pomocą modułu zarządzania zasobami, aparat Database Engine używa wartości MAXDOP modułu zarządzania zasobami opisanej w temacie ALTER obciążenia GROUP (języka Transact-SQL).W przypadku użycia wskazówki MAXDOP dotyczącej kwerendy mają zastosowanie wszystkie reguły semantyczne użyte z opcją konfiguracji maksymalnego stopnia równoległości.Aby uzyskać więcej informacji, zobacz max degree of parallelism Option.

  • OPTIMIZE FOR ( @variable\_name { UNKNOWN | = literal_constant } [ , ...n ] )
    Określa, że podczas kompilowania i optymalizowania kwerendy optymalizator kwerendy ma użyć określonej wartości zmiennej lokalnej.Wartość ta jest używana tylko podczas optymalizowania kwerendy, a nie jej wykonywania.

    • @variable\_name
      Nazwa używanej w kwerendzie zmiennej lokalnej, której może zostać przypisana wartość do użycia ze wskazówką OPTIMIZE FOR dotyczącą kwerendy.

    • UNKNOWN
      vermajor

    • literal_constant
      Is a literal constant value to be assigned @variable\_name for use with the OPTIMIZE FOR query hint.literal_constant is used only during query optimization, and not as the value of @variable\_name during query execution.literal_constant can be of any SQL Server system data type that can be expressed as a literal constant.Typ danych literal_constant musi być niejawnie przekonwertować danych wpisać @variable\_name odwołania w kwerendzie.

    Wskazówka OPTIMIZE FOR może neutralizować domyślne zachowanie optymalizatora dotyczące wykrywania parametrów lub może być używana podczas tworzenia przewodników planu.Aby uzyskać więcej informacji, zobacz Recompiling Stored Procedures i Optimizing Queries in Deployed Applications by Using Plan Guides.

  • verbuild
    Określa, że podczas kompilowania i optymalizowania kwerendy optymalizator kwerendy ma użyć danych statystycznych, w tym parametrów utworzonych w trakcie parametryzacji wymuszonej, a nie wartości początkowych wszystkich zmiennych lokalnych.Aby uzyskać więcej informacji dotyczących parametryzacji wymuszonej, zobacz Parametryzacja wymuszony.

    Jeśli w tej samej wskazówce dotyczącej kwerendy są używane wskazówki OPTIMIZE FOR @variable\_name = literal_constant i OPTIMIZE FOR UNKNOWN, optymalizator kwerendy używa parametru literal_constant podanego dla określonej wartości i opcji UNKNOWN dla pozostałych wartości zmiennych.Wartości te są używane tylko podczas optymalizowania kwerendy, a nie jej wykonywania.

  • isencrypted
    Określa zasady parametry, które SQL Server optymalizator kwerendy ma zastosowanie do kwerendy, gdy jest on skompilowany.

    Important noteImportant Note:

    Wskazówkę PARAMETERIZATION dotyczącą kwerendy można określić tylko w przewodniku planu.Nie można jej określić bezpośrednio w kwerendzie.

    Wskazówka SIMPLE określa, że optymalizator kwerendy ma podjąć próbę wykonania parametryzacji zwykłej.Wskazówka FORCED określa, że optymalizator kwerendy ma podjąć próbę wykonania parametryzacji wymuszonej.Wskazówka PARAMETERIZATION dotycząca kwerendy jest używana w celu zastąpienia bieżącego ustawienia opcji SET bazy danych PARAMETERIZATION wewnątrz przewodnika planu.Aby uzyskać więcej informacji, zobacz Specifying Query Parameterization Behavior by Using Plan Guides.

  • RECOMPILE
    Określa, że aparat SQL Server Database Engine ma po wykonaniu kwerendy usunąć wygenerowany dla niej plan, wymuszając na optymalizatorze kwerendy ponowne skompilowanie przewodnika planu przy następnym jej wykonywaniu.Jeśli wskazówka RECOMPILE nie jest określona, aparat Database Engine buforuje plany kwerendy i używa ich wielokrotnie.Podczas kompilowania planów kwerendy, wskazówka RECOMPILE dotycząca kwerendy używa bieżących wartości wszelkich zmiennych lokalnych w kwerendzie i, jeśli kwerenda znajduje się wewnątrz procedury składowanej, bieżących wartości przekazanych do wszelkich parametrów.

    Wskazówka RECOMPILE jest przydatną alternatywną metodą tworzenia procedury składowanej używającej klauzuli WITH RECOMPILE, jeśli musi zostać ponownie skompilowany tylko pewien podzestaw kwerend wewnątrz procedury składowanej, a nie cała procedura.Aby uzyskać więcej informacji, zobacz Recompiling Stored Procedures.Wskazówka RECOMPILE jest również przydatna przy tworzeniu przewodników planu.Aby uzyskać więcej informacji, zobacz Optimizing Queries in Deployed Applications by Using Plan Guides.

  • ROBUST PLAN
    Wymusza na optymalizatorze kwerendy próbę wykonania planu działającego z użyciem maksymalnego potencjalnego rozmiaru wiersza, zwykle kosztem wydajności.Podczas przetwarzania kwerendy może zachodzić konieczność przechowywania i przetwarzania, za pomocą pośrednich tabel i operatorów, wierszy szerszych od jakichkolwiek wierszy wejściowych.Czasami te wiersze mogą być tak szerokie, że określony operator nie może przetworzyć wiersza.W takim przypadku aparat Database Engine zgłasza błąd podczas wykonywania kwerendy.Wskazówka ROBUST PLAN określa, że optymalizator kwerendy ma nie brać pod uwagę żadnych planów kwerendy, które mogą napotkać ten problem.

    Ta procedura nosi nazwę przez składnik czas wykonywania moduł zbierający dane przy każdym uruchamianiu pakiet wysyłania, przekazywania danych do magazyn danych zarządzania.Wiersze mogą zawierać kolumny o zmiennej długości, Database Engine pozwala na określone wiersze, które mają maksymalny rozmiar potencjalnych poza zdolność Database Engine do ich przetworzenia. Ogólnie rzecz biorąc, pomimo Potencjalny maksymalny rozmiar, aplikacja przechowuje wierszy, które zawierają rzeczywiste rozmiary w ramach którego Database Engine w stanie przetworzyć. Jeśli Database Engine napotka a wiersz, który jest zbyt długa, zwracany jest błąd wykonania.

  • KEEP PLAN
    Wymusza na optymalizatorze kwerendy złagodzenie szacowanego progu ponownej kompilacji dla kwerendy.Szacowany próg ponownej kompilacji to punkt, w którym kwerenda jest automatycznie ponownie kompilowana po dokonaniu szacowanej liczby zmian kolumn indeksowanych wskutek uruchomienia instrukcji UPDATE, DELETE, MERGE lub INSERT.Określenie wskazówki KEEP PLAN zapewnia, że kwerenda nie jest tak często ponownie kompilowana w przypadku dokonywania wielu aktualizacji tabeli.

  • KEEPFIXED PLAN
    Powoduje, że optymalizator kwerendy nie wykonuje ponownej kompilacji kwerendy z powodu zmian w statystyce.Określenie wskazówki KEEPFIXED PLAN zapewnia, że kwerenda będzie ponownie kompilowana tylko w przypadku zmiany schematu tabel źródłowych lub wykonania procedury sp_recompile w odniesieniu do tych tabel.

  • Przy każdym pakiet przekazywania przekazywania danych do magazyn danych zarządzania składnika czas wykonywania moduł zbierający dane wywołuje core.sp_update_data_source.
    Tabela core.source_info_internal jest aktualizowana, jeśli wystąpił jeden z następujących zmian od czasu ostatniego wysyłania:Nowy zestaw kolekcja został dodany.

    Wartość parametru days_until_expiration została zmieniona.

    The indexed view is not expanded only if the view is directly referenced in the SELECT part of the query and WITH (NOEXPAND) or WITH (NOEXPAND, INDEX( index_value [ ,... n ] ) ) is specified.For more information about the query hint WITH (NOEXPAND), see FROM.

    W przykładzie użyto domyślnego wystąpienie.

  • Poprawiono nazwę tabela core.source_info_internal w pierwszym zdaniu.number
    Specifies the maximum number of recursions allowed for this query.number is a nonnegative integer between 0 and 32767.Jeżeli określono wartość 0, brak limitu jest stosowana.Poprawiono nazwę tabela core.source_info_internal i argument days_until_expiration w sekcji "Uwagi".

    Poprawiono identyfikator GUID, nazwy argumentów i składni w przykładzie.

    Z powodu tego błędu wszystkie skutki instrukcji są wycofywane.Jeśli instrukcja jest instrukcją SELECT, mogą zostać zwrócone wyniki częściowe lub mogą nie zostać zwrócone żadne wyniki.Zwrócone wyniki częściowe mogą nie uwzględniać wszystkich wierszy na poziomach rekursji ponad określonym maksymalnym poziomem rekursji.

    Aby uzyskać więcej informacji zobacz WITH common_table_expression (Transact-SQL).

  • USE, PLAN N "xml_plan'
    Zmusza optymalizator kwerendy, aby użyć istniejącego planu kwerendy dla kwerendy, która jest określona przez "xml_plan'.Aby uzyskać więcej informacji zobaczSpecifying Query Plans with Plan Forcing.Kwerendy wskazówki mają wpływ na wszystkie operatory w instrukcja.

  • TABLE HINT (exposed_object_name [ , <table_hint> [ [, ]...n ] ] )
    Stosuje określoną wskazówkę dotyczącą tabeli do tabeli lub widoku odpowiadającego parametrowi exposed_object_name.Zaleca się, aby wskazówki dotyczącej tabeli używać jako wskazówki dotyczącej kwerendy tylko w kontekście przewodnika planu.

    Parametr exposed_object_name może być jednym z następujących odwołań:

    • Gdy jest używany do aliasu dla tabela lub w widoku Z Klauzula kwerendy, exposed_object_name to alias.

    • Gdy dany alias nie jest używany, exposed_object_name jest dokładne dopasowanie, tabela lub widoku w klauzula FROM. Na przykład, jeśli tabela lub widok jest wywoływany przy użyciu nazwy dwóch części, exposed_object_name jest taka sama nazwa dwóch części.

    Kiedy exposed_object_name jest określona bez określenia również wskazówka tabela, wszystkie indeksy określone w kwerendzie jako część wskazówkę tabela dla tego obiektu są pomijane i użycie indeksu jest określana przez optymalizator kwerendy. Określa, że wszystkie operacje UNION są wykonywane przez scalanie, mieszanie, lub ustawia konkatenację UNION.Jeżeli określono więcej niż jeden wskazówka UNION, optymalizator kwerendy wybiera strategii najniższych z tych wskazówek określony.

  • <table_hint> ::= {[NOEXPAND] {INDEX ( index_value ,...n ) | INDEX = (index_value ) | FASTFIRSTROW | FORCESEEK | HOLDLOCK | NOLOCK | NOWAIT | PAGLOCK | READCOMMITTED | READCOMMITTEDLOCK | READPAST | READUNCOMMITTED | REPEATABLEREAD | ROWLOCK | MOŻLIWY DO SERIALIZACJI | TABLOCK | TABLOCKX | UPDLOCK | XLOCK}
    Czy wskazówkę dotyczącą tabela do tabela lub widoku, który odpowiada exposed_object_name jako wskazówkę dotyczącą kwerendy. Aby uzyskać opis tych wskazówek zobacz Wskazówki do tabela (języka Transact-SQL).

    Jeżeli w tej samej kwerendy wskazówkę dotyczącą łączyć jest określony również w klauzula FROM dla określonych pary tabel, ta wskazówka łączyć pierwszeństwo w łącząca dwie tabele, chociaż nadal wskazówki kwerendy musi być honorowane.Aby uzyskać więcej informacji zobacz Spostrzeżenia.

Remarks

W związku z tym wskazówka łączyć dla pary tabel, tylko może ograniczyć wybór metody dozwolone łączyć w wskazówki dotyczącej kwerendy.

Wskazówki dotyczące kwerendy można określać tylko w kwerendzie najwyższego poziomu, a nie w podkwerendach.Jeśli wskazówka dotycząca tabeli jest określana jako wskazówka dotycząca kwerendy, wskazówkę można określić w kwerendzie najwyższego poziomu lub w podkwerendzie, jednak wartość określona dla parametru exposed_object_name w klauzuli TABLE HINT musi dokładnie odpowiadać uwidocznionej nazwie obiektu w kwerendzie lub podkwerendzie.

Określanie wskazówek dotyczących tabeli jako wskazówek dotyczących kwerendy

Zaleca się stosowanie wskazówki dotyczącej indeks lub FORCESEEK tabela jako wskazówka dotycząca kwerendy tylko w kontekście plan wykonania kwerendy.Określa, że kolejność łączyć wskazywany przez składnię kwerendy są zachowywane podczas optymalizacji kwerendy.Za pomocą FORCE ORDER nie wpływa na zachowanie odwrócenie możliwe roli optymalizator kwerendy.W instrukcja korespondencji SERYJNEJ, w tabela źródłowej jest dostępny przed tabela miejsce docelowe jako domyślnej kolejności łączyć, chyba że po klauzula MATCHED źródłową nie został określony.Określanie FORCE ORDER zachowuje to zachowanie domyślne.

Wskazówki INDEX i FORCESEEK dotyczące tabeli określone jako wskazówki dotyczące kwerendy są prawidłowe dla następujących obiektów:

  • Tabele

  • Widoki

  • Widoki indeksowane

  • Zastępuje maksymalny stopień proste opcja konfiguracja sp_configure i zasób Governor dla kwerendy, zaznaczenie tej opcji.

  • Wskazówka dotycząca kwerendy MAXDOP mogą przekraczać wartości skonfigurowano sp_configure.

  • Nazwane podkwerendy

Przykłady

A.Określa, że optymalizator kwerendy używać danych statystycznych zamiast wartość początkowa do określenia wartości dla zmiennej lokalnej podczas optymalizacji kwerendy.

W poniższym przykładzie określa, że JOIN Operacja w kwerendzie jest wykonywana przez MERGE JOIN.

B.Użycie wskazówki OPTIMIZE FOR

Poniższy przykład powoduje, że optymalizator kwerendy, aby użyć wartości 'Seattle' Aby zmienna lokalna @city\_name i wykorzystywanie danych statystycznych do określenia wartości dla zmiennej lokalnej @postal\_code Po optymalizacji kwerendy.

C.OPTYMALIZACJA NIEZNANY

Powoduje, że optymalizator kwerendy, aby użyć danych statystycznych zamiast wartości początkowe dla wszystkich zmiennych lokalnych, gdy kwerenda jest skompilowany i zoptymalizowane, łącznie z parametrami utworzone za pomocą parametryzacji wymuszone.W poniższym przykładzie rozmyślnie tworzy nieskończonej pętli i używa MAXRECURSION Wskazówka do ograniczania liczby poziomów rekursji do dwóch.

USE AdventureWorks;
GO
--Creates an infinite loop
WITH cte (EmployeeID, ManagerID, Title) AS
(
    SELECT EmployeeID, ManagerID, Title
    FROM HumanResources.Employee
    WHERE ManagerID IS NOT NULL
  UNION ALL
    SELECT cte.EmployeeID, cte.ManagerID, cte.Title
    FROM cte 
    JOIN  HumanResources.Employee AS e 
        ON cte.ManagerID = e.EmployeeID
)
--Uses MAXRECURSION to limit the recursive levels to 2
SELECT EmployeeID, ManagerID, Title
FROM cte
OPTION (MAXRECURSION 2);
GO

Aby uzyskać więcej informacji na temat parametryzacji wymuszony zobacz MAXRECURSION.

D.Użycie wskazówki MERGE UNION

W poniższym przykładzie użyto MERGE UNION Wskazówka dotycząca kwerendy.

E.PARAMETRY {PROSTE | ZMUSZONY}

W poniższym przykładzie użyto HASH GROUP i FAST wskazówki kwerendy.

F.Wskazówka dotycząca kwerendy PARAMETRYZACJA może być określony tylko wewnątrz plan wykonania kwerendy.

W poniższym przykładzie użyto MAXDOP Wskazówka dotycząca kwerendy.

G.Użycie wskazówki INDEX

Poniższe przykłady ilustrują użycie wskazówki INDEX.W pierwszym przykładzie jest określony jeden indeks.W drugim przykładzie jest określonych wiele indeksów dla jednego odwołania do tabeli.W obu przykładach, ponieważ wskazówka INDEX jest stosowana do tabeli używającej aliasu, w klauzuli TABLE HINT należy również określić ten sam alias jako uwidocznioną nazwę obiektu.

H.Użycie wskazówki FORCESEEK

W poniższym przykładzie użyto FORCESEEK Wskazówka tabela. Ponieważ INDEX Wskazówka jest stosowana dla tabela, która używa nazwy dwóch części, TABLE HINT Klauzula muszą również określać jako nazwę obiektu narażonych tej samej nazwie z dwóch części.

I.RECOMPILE jest również przydatna podczas tworzenia planu prowadnic.

Stosuje się w następującym przykładzie INDEX Wskazówka do jednej tabela oraz FORCESEEK Wskazówka do innego.

J.Zmusza optymalizator kwerendy, aby spróbować planu, który działa w przypadku potencjalnych wiersza rozmiar maksymalny, prawdopodobnie na koszt o wydajności.

W poniższym przykładzie przedstawiono sposób użycia TABLE HINT Wskazówka bez określenia wskazówkę, aby zastąpić zachowanie INDEX Wskazówka tabela określonego w FROM Klauzula kwerendy.

K.Określanie wskazówek dotyczących tabeli, które wpływają na semantykę

Za pomocą PLAN NIEZAWODNE, można poinstruować optymalizator kwerendy, aby nie należy wziąć pod uwagę wszystkie plany kwerend, które można napotkać ten problem.NOLOCK, czyli semantycznej — na, a INDEX, który jest inne niż semantycznej — na. Wiersze mogą zawierać kolumny o zmiennej długości, NOLOCK pozwala na określone wiersze, które mają maksymalny rozmiar potencjalnych poza zdolność OPTIONS do ich przetworzenia. Oprócz NOLOCK wskazówki, INDEX i FORCESEEK wskazówki są określane i zastąpić nie semantycznej — na INDEX Wskazówka dotycząca kwerendy po instrukcja jest skompilowany i zoptymalizowany.

W poniższym przykładzie pokazano alternatywną metodę zachowania semantyki kwerendy i umożliwienia optymalizatorowi wybrania indeksu innego niż indeks określony we wskazówce dotyczącej tabeli.Polega ona na określeniu wskazówki NOLOCK w klauzuli OPTIONS (ponieważ wpływa ona na semantykę) i określeniu słowa kluczowego TABLE HINT tylko z odwołaniem do tabeli i bez wskazówki INDEX.