Udostępnij za pośrednictwem


Wskazówki dotyczące zapytań (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstancePunkt końcowy analizy SQL w usłudze Microsoft FabricMagazyn w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric (wersja zapoznawcza)

Wskazówki dotyczące zapytań określają, że wskazane wskazówki są używane w zakresie zapytania. Mają one wpływ na wszystkie operatory w instrukcji . Jeśli UNION jest zaangażowany w główne zapytanie, tylko ostatnie zapytanie obejmujące operację UNION może mieć klauzulę OPTION . Wskazówki dotyczące zapytań są określane jako część klauzuli OPTION. Błąd 8622 występuje, jeśli co najmniej jedna wskazówka zapytania powoduje, że optymalizator zapytań nie generuje prawidłowego planu.

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.

Applies to:

Transact-SQL konwencje składni

Syntax

<query_hint> ::=
{ { HASH | ORDER } GROUP
  | { CONCAT | HASH | MERGE } UNION
  | { LOOP | MERGE | HASH } JOIN
  | DISABLE_OPTIMIZED_PLAN_FORCING
  | EXPAND VIEWS
  | FAST <integer_value>
  | FORCE ORDER
  | { FORCE | DISABLE } EXTERNALPUSHDOWN
  | { FORCE | DISABLE } SCALEOUTEXECUTION
  | IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
  | KEEP PLAN
  | KEEPFIXED PLAN
  | MAX_GRANT_PERCENT = <numeric_value>
  | MIN_GRANT_PERCENT = <numeric_value>
  | MAXDOP <integer_value>
  | MAXRECURSION <integer_value>
  | NO_PERFORMANCE_SPOOL
  | OPTIMIZE FOR ( @variable_name { UNKNOWN | = <literal_constant> } [ , ...n ] )
  | OPTIMIZE FOR UNKNOWN
  | PARAMETERIZATION { SIMPLE | FORCED }
  | QUERYTRACEON <integer_value>
  | RECOMPILE
  | ROBUST PLAN
  | USE HINT ( 'hint_name' [ , ...n ] )
  | USE PLAN N'<xml_plan>'
  | TABLE HINT ( <exposed_object_name> [ , <table_hint> [ [ , ] ...n ] ] )
  | FOR TIMESTAMP AS OF '<point_in_time>'
}

<table_hint> ::=
{ NOEXPAND [ , INDEX ( <index_value> [ , ...n ] ) | INDEX = ( <index_value> ) ]
  | INDEX ( <index_value> [ , ...n ] ) | INDEX = ( <index_value> )
  | FORCESEEK [ ( <index_value> ( <index_column_name> [ , ... ] ) ) ]
  | FORCESCAN
  | HOLDLOCK
  | NOLOCK
  | NOWAIT
  | PAGLOCK
  | READCOMMITTED
  | READCOMMITTEDLOCK
  | READPAST
  | READUNCOMMITTED
  | REPEATABLEREAD
  | ROWLOCK
  | SERIALIZABLE
  | SNAPSHOT
  | SPATIAL_WINDOW_MAX_CELLS = <integer_value>
  | TABLOCK
  | TABLOCKX
  | UPDLOCK
  | XLOCK
}

Arguments

{ HASH | ORDER } GROUP

Określa, że agregacje opisane w zapytaniu GROUP BY lub DISTINCT klauzuli powinny używać skrótów lub porządkowania.

  • Ogólnie rzecz biorąc, algorytm oparty na skrótach może poprawić wydajność zapytań obejmujących duże lub złożone zestawy grupowania.
  • Ogólnie rzecz biorąc, algorytm oparty na sortowaniu może poprawić wydajność zapytań obejmujących małe lub proste zestawy grupowania.

{ MERGE | Skrót skrótu | CONCAT } UNION

Określa, że wszystkie UNION operacje są uruchamiane przez scalanie, wyznaczanie UNION wartości skrótu lub łączenie zestawów. Jeśli określono więcej niż jedną UNION wskazówkę, optymalizator zapytań wybiera najmniej kosztowną strategię z podanych wskazówek.

  • Ogólnie rzecz biorąc, operacja algorytmu opartego na scalaniu może poprawić wydajność zapytań obejmujących posortowane dane wejściowe.
  • Ogólnie rzecz biorąc, algorytm oparty na skrótach może poprawić wydajność zapytań obejmujących niesortowane lub duże dane wejściowe.
  • Ogólnie rzecz biorąc, algorytm oparty na łączeniach może poprawić wydajność zapytań obejmujących różne lub małe dane wejściowe.

{ PĘTLA | MERGE | SPRZĘŻENIA HASH }

Określa, że wszystkie operacje sprzężenia są wykonywane przez LOOP JOIN, MERGE JOINlub HASH JOIN w całym zapytaniu. Jeśli określisz więcej niż jedną wskazówkę sprzężenia, optymalizator wybierze najmniej kosztowną strategię sprzężenia z dozwolonych.

Jeśli określisz wskazówkę sprzężenia w klauzuli FROM tego samego zapytania dla określonej pary tabeli, ta wskazówka sprzężenia ma pierwszeństwo przed łączeniem dwóch tabel. Jednak wskazówki dotyczące zapytania muszą być nadal honorowane. Wskazówka sprzężenia dla pary tabel może ograniczyć tylko wybór dozwolonych metod sprzężenia w wskazówce zapytania. Aby uzyskać więcej informacji, zobacz Wskazówki dotyczące dołączania.

DISABLE_OPTIMIZED_PLAN_FORCING

Dotyczy: SQL Server (począwszy od programu SQL Server 2022 (16.x))

Wyłącza wymuszanie zoptymalizowanego planu dla zapytania.

Zoptymalizowany plan wymusza zmniejszenie nakładu pracy kompilacji na potrzeby powtarzania wymuszonych zapytań. Po wygenerowaniu planu wykonywania zapytania określone kroki kompilacji są przechowywane do ponownego użycia jako skrypt ponownego odtwarzania optymalizacji. Skrypt odtwarzania optymalizacji jest przechowywany jako część skompresowanego kodu XML programu showplan w Magazynu zapytań, w ukrytym atrybucie OptimizationReplay.

EXPAND VIEWS

Określa, że widoki indeksowane są rozwinięte. Określa również optymalizator zapytań nie uwzględnia żadnego indeksowanego widoku jako zamiennika żadnej części zapytania. Widok jest rozwijany, gdy definicja widoku zastępuje nazwę widoku w tekście zapytania.

Ta wskazówka zapytania praktycznie nie zezwala na bezpośrednie użycie indeksowanych widoków i indeksów w widokach indeksowanych w planie zapytania.

Note

Widok indeksowany pozostaje skondensowany, jeśli istnieje bezpośrednie odwołanie do widoku w części zapytania SELECT . Widok pozostaje również skondensowany, jeśli określisz WITH (NOEXPAND) wartość lub WITH (NOEXPAND, INDEX( <index_value> [ , *...n* ] ) ). Aby uzyskać więcej informacji na temat wskazówki NOEXPANDdotyczącej zapytania, zobacz Using NOEXPAND (Używanie funkcji NOEXPAND).

Wskazówka dotyczy tylko widoków w części instrukcji SELECT , w tym tych widoków w INSERTinstrukcjach , UPDATE, MERGEi DELETE .

FAST integer_value

Określa, że zapytanie jest zoptymalizowane pod kątem szybkiego pobierania pierwszej integer_value liczby wierszy. Ten wynik jest nieujemną liczbą całkowitą. Po zwróceniu pierwszej integer_value liczby wierszy zapytanie kontynuuje wykonywanie i generuje pełny zestaw wyników.

FORCE ORDER

Określa, że kolejność sprzężenia wskazywana przez składnię zapytania jest zachowywana podczas optymalizacji zapytań. Użycie FORCE ORDER nie ma wpływu na możliwe zachowanie odwrócenia roli optymalizatora zapytań.

FORCE ORDER zachowuje kolejność sprzężenia określoną w zapytaniu, co może poprawić wydajność lub spójność zapytań obejmujących złożone warunki lub wskazówki dotyczące sprzężenia.

Note

MERGE W instrukcji dostęp do tabeli źródłowej jest uzyskiwany przed tabelą docelową jako domyślną kolejnością sprzężenia, chyba że określono klauzulę WHEN SOURCE NOT MATCHED . Określenie FORCE ORDER zachowania tego domyślnego zachowania.

{ FORCE | WYŁĄCZ } EXTERNALPUSHDOWN

Wymuś lub wyłącz wypychanie obliczeń wyrażeń kwalifikowanych w usłudze Hadoop. Dotyczy tylko zapytań korzystających z technologii PolyBase. Nie wypycha do usługi Azure Storage.

{ FORCE | WYŁĄCZ } SCALEOUTEXECUTION

Wymuś lub wyłącz wykonywanie zapytań PolyBase skalowanych w poziomie, które używają tabel zewnętrznych w klastrach danych big data programu SQL Server 2019. Ta wskazówka jest uwzględniana tylko przez zapytanie przy użyciu głównego wystąpienia klastra danych big data SQL. Skalowanie w poziomie odbywa się w puli obliczeniowej klastra danych big data.

KEEP PLAN

Zmienia progi ponownej kompilacji dla tabel tymczasowych i sprawia, że są identyczne z progami tabel stałych. Szacowany próg ponownego kompilowania rozpoczyna automatyczne ponowne kompilowanie zapytania, gdy szacowana liczba zmian w indeksowanej kolumnie zostanie wprowadzona do tabeli, uruchamiając jedną z następujących instrukcji:

  • UPDATE
  • DELETE
  • MERGE
  • INSERT

Określenie KEEP PLAN zapewnia, że zapytanie nie jest ponownie kompilowane tak często, gdy istnieje wiele aktualizacji tabeli.

KEEPFIXED PLAN

Wymusza, aby optymalizator zapytań nie kompilować zapytania z powodu zmian w statystykach. Określenie KEEPFIXED PLAN zapewnia, że zapytanie ponownie kompiluje się tylko wtedy, gdy schemat bazowych tabel ulegnie zmianie lub jeśli sp_recompile zostanie uruchomiony względem tych tabel.

IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX

Dotyczy: SQL Server (począwszy od programu SQL Server 2012 (11.x)).

Uniemożliwia wykonywanie zapytania przy użyciu indeksu magazynu kolumn zoptymalizowanego pod kątem nieklastrowanej pamięci. Jeśli zapytanie zawiera wskazówkę zapytania, aby uniknąć korzystania z indeksu magazynu kolumn, a wskazówka indeksu do użycia indeksu magazynu kolumn, wskazówki są w konflikcie, a zapytanie zwraca błąd.

MAX_GRANT_PERCENT = <numeric_value>

Dotyczy: SQL Server (począwszy od programu SQL Server 2012 (11.x) z dodatkiem Service Pack 3, SQL Server 2014 (12.x) z dodatkiem Service Pack 2 i usługą Azure SQL Database.

Maksymalny rozmiar przydziału pamięci w PERCENT skonfigurowanym limicie pamięci. Kwerenda ma gwarancję, że nie przekroczy tego limitu, jeśli zapytanie jest uruchomione w puli zasobów zdefiniowanych przez użytkownika. W takim przypadku, jeśli zapytanie nie ma minimalnej wymaganej pamięci, system zgłasza błąd. Jeśli zapytanie jest uruchomione w puli systemowej (wartość domyślna), zostanie uruchomiona co najmniej pamięć wymagana do uruchomienia. Rzeczywisty limit może być niższy, jeśli ustawienie Zarządca zasobów jest niższe niż wartość określona przez tę wskazówkę. Prawidłowe wartości to od 0.0 do 100.0.

Wskazówka dotycząca przyznawania pamięci nie jest dostępna na potrzeby tworzenia indeksu ani ponownego kompilowania indeksu.

MIN_GRANT_PERCENT = <numeric_value>

Dotyczy: SQL Server (począwszy od programu SQL Server 2012 (11.x) z dodatkiem Service Pack 3, SQL Server 2014 (12.x) z dodatkiem Service Pack 2 i usługą Azure SQL Database.

Minimalny rozmiar przydziału pamięci w PERCENT skonfigurowanym limicie pamięci. Zapytanie jest gwarantowane, MAX(required memory, min grant) ponieważ do uruchomienia zapytania jest wymagana co najmniej wymagana pamięć. Prawidłowe wartości to od 0.0 do 100.0.

Opcja udzielenia pamięci min_grant_percent zastępuje sp_configure opcję (minimalna ilość pamięci na zapytanie (KB)) niezależnie od rozmiaru. Wskazówka dotycząca przyznawania pamięci nie jest dostępna na potrzeby tworzenia indeksu ani ponownego kompilowania indeksu.

INTEGER_VALUE MAXDOP <>

Dotyczy: SQL Server (począwszy od programu SQL Server 2008 (10.0.x)) i usługi Azure SQL Database.

Zastępuje maksymalny stopień konfiguracji równoległości opcji sp_configure. Zastępuje również zarządcę zasobów dla zapytania określającego tę opcję. Wskazówka MAXDOP zapytania może przekroczyć wartość skonfigurowaną za pomocą sp_configurepolecenia . Jeśli MAXDOP przekroczy wartość skonfigurowaną za pomocą zarządcy zasobów, aparat bazy danych używa wartości Zarządca MAXDOP zasobów opisanej w artykule ALTER WORKLOAD GROUP (ALTER WORKLOAD GROUP). Wszystkie reguły semantyczne używane z opcją konfiguracji maksymalnego stopnia równoległości mają zastosowanie podczas korzystania z MAXDOP wskazówki dotyczącej zapytania. Aby uzyskać więcej informacji, zobacz Konfiguracja serwera: maksymalny stopień równoległości.

Warning

Jeśli MAXDOP ustawiono wartość zero, serwer wybierze maksymalny stopień równoległości.

INTEGER_VALUE MAXRECURSION <>

Określa maksymalną dozwoloną liczbę rekursji dla tego zapytania. liczba jest dodatnią liczbą całkowitą z zakresu od 0 do 32 767. Po określeniu wartości 0 nie zostanie zastosowany żaden limit. Jeśli ta opcja nie zostanie określona, domyślny limit dla serwera wynosi 100.

Gdy podczas wykonywania zapytania zostanie osiągnięta określona lub domyślna liczba limitu MAXRECURSION , zapytanie kończy się i zwraca błąd.

Z powodu tego błędu wszystkie efekty instrukcji są cofane. Jeśli instrukcja jest instrukcją SELECT , wyniki częściowe lub żadne wyniki nie mogą być zwracane. Wszystkie zwrócone częściowe wyniki mogą nie zawierać wszystkich wierszy na poziomach rekursji powyżej określonego maksymalnego poziomu rekursji.

Aby uzyskać więcej informacji, zobacz WITH common_table_expression (WITH common_table_expression).

NO_PERFORMANCE_SPOOL

Dotyczy: SQL Server (począwszy od programu SQL Server 2016 (13.x)) i usługi Azure SQL Database.

Zapobiega dodawaniu operatora buforu do planów zapytań (z wyjątkiem planów, gdy bufor jest wymagany do zagwarantowania prawidłowej semantyki aktualizacji). Operator buforu może zmniejszyć wydajność w niektórych scenariuszach. Na przykład pula używa metody tempdb, a tempdb rywalizacja może wystąpić, jeśli istnieje wiele współbieżnych zapytań uruchomionych przy użyciu operacji buforowania.

OPTYMALIZUJ POD KĄTEM ( @variable_name { UNKNOWN | = <literal_constant> } [ , ... n ] )

Nakazuje optymalizatorowi zapytań użycie określonej wartości dla zmiennej lokalnej podczas kompilowania i optymalizowania zapytania. Wartość jest używana tylko podczas optymalizacji zapytań, a nie podczas wykonywania zapytania.

  • @variable_name

    Nazwa zmiennej lokalnej używanej w zapytaniu, do której można przypisać wartość do użycia z OPTIMIZE FOR wskazówką zapytania.

  • UNKNOWN

    Określa, że Optymalizator zapytań używa danych statystycznych zamiast wartości początkowej, aby określić wartość zmiennej lokalnej podczas optymalizacji zapytań.

  • literal_constant

    Wartość stałej literału, która ma być przypisana @variable_name do użycia z wskazówką OPTIMIZE FOR zapytania. literal_constant jest używana tylko podczas optymalizacji zapytań, a nie jako wartość @variable_name podczas wykonywania zapytania. literal_constant może być dowolnym typem danych systemowych programu SQL Server, które mogą być wyrażone jako stała literału. Typ danych literal_constant musi być niejawnie konwertowany na typ danych, który @variable_name odwołania w zapytaniu.

FUNKCJA OPTIMIZE FOR może przeciwdziałać domyślnemu zachowaniu wykrywania parametrów optymalizatora. Należy również użyć OPTIMIZE FOR podczas tworzenia przewodników planu. Aby uzyskać więcej informacji, zobacz Recompile a Stored Procedure (Ponowne kompilowanie procedury składowanej).

OPTYMALIZOWANIE POD KĄTEM NIEZNANYCH

Instruuje Optymalizator zapytań, aby używał średniego wyboru predykatu we wszystkich wartościach kolumn, zamiast używać wartości parametru środowiska uruchomieniowego podczas kompilowania i optymalizowania zapytania.

Jeśli używasz OPTIMIZE FOR @variable_name = <literal_constant> funkcji i OPTIMIZE FOR UNKNOWN w tej samej wskazówce zapytania, optymalizator zapytań używa literal_constant określonego dla określonej wartości. Optymalizator zapytań używa wartości UNKNOWN dla pozostałych wartości zmiennych. Wartości są używane tylko podczas optymalizacji zapytań, a nie podczas wykonywania zapytania.

PARAMETRYZACJA { SIMPLE | WYMUSZONE }

Określa reguły parametryzacji, które optymalizator zapytań programu SQL Server ma zastosowanie do zapytania podczas kompilowania.

Important

Wskazówkę PARAMETERIZATION zapytania można określić tylko wewnątrz przewodnika planu, aby zastąpić bieżące ustawienie PARAMETERIZATION opcji bazy danych SET . Nie można określić jej bezpośrednio w zapytaniu.

Aby uzyskać więcej informacji, zobacz Określanie zachowania parametryzacji zapytań przy użyciu przewodników planu.

SIMPLE Nakazuje Optymalizatorowi zapytań próbę prostego parametryzacji. FORCED Nakazuje optymalizatorowi zapytań próbę wymuszonej parametryzacji. Aby uzyskać więcej informacji, zobacz Wymuszone parametryzację w przewodniku po architekturze przetwarzania zapytań i proste parametryzację w przewodniku po architekturze przetwarzania zapytań.

INTEGER_VALUE QUERYTRACEON <>

Ta opcja umożliwia włączenie flagi śledzenia wpływającej na plan tylko podczas kompilacji pojedynczego zapytania. Podobnie jak w przypadku innych opcji na poziomie zapytania, można jej używać razem z przewodnikami planu, aby dopasować tekst zapytania wykonywanego z dowolnej sesji i automatycznie zastosować flagę śledzenia wpływającą na plan podczas kompilowania tego zapytania. Opcja jest obsługiwana QUERYTRACEON tylko dla flag śledzenia optymalizatora zapytań. Aby uzyskać więcej informacji, zobacz Trace Flags.

Użycie tej opcji nie zwraca żadnego błędu ani ostrzeżenia, jeśli jest używany nieobsługiwany numer flagi śledzenia. Jeśli określona flaga śledzenia nie ma wpływu na plan wykonywania zapytania, opcja jest ignorowana w trybie dyskretnym.

Aby użyć więcej niż jednej flagi śledzenia w zapytaniu, określ jedną QUERYTRACEON wskazówkę dla każdego innego numeru flagi śledzenia.

RECOMPILE

Nakazuje aparatowi bazy danych programu SQL Server wygenerowanie nowego, tymczasowego planu zapytania i natychmiastowe odrzucenie tego planu po zakończeniu wykonywania zapytania. Wygenerowany plan zapytania nie zastępuje planu przechowywanego w pamięci podręcznej, gdy to samo zapytanie jest uruchamiane bez RECOMPILE wskazówki. Bez określania RECOMPILEparametru aparat bazy danych buforuje plany zapytań i ponownie je używa. Podczas kompilowania RECOMPILE planów zapytań wskazówka zapytania używa bieżących wartości dowolnych zmiennych lokalnych w zapytaniu. Jeśli zapytanie znajduje się wewnątrz procedury składowanej, bieżące wartości przekazane do dowolnych parametrów.

RECOMPILE jest przydatną alternatywą do tworzenia procedury składowanej. RECOMPILE używa klauzuli WITH RECOMPILE , gdy należy ponownie skompilować tylko podzbiór zapytań wewnątrz procedury składowanej zamiast całej procedury składowanej. Aby uzyskać więcej informacji, zobacz Recompile a Stored Procedure (Ponowne kompilowanie procedury składowanej). RECOMPILE jest również przydatny podczas tworzenia przewodników dotyczących planu.

ROBUST PLAN

Wymusza optymalizator zapytań, aby wypróbować plan, który działa dla maksymalnego potencjalnego rozmiaru wiersza, prawdopodobnie kosztem wydajności. Gdy zapytanie jest przetwarzane, tabele pośrednie i operatory mogą potrzebować przechowywania i przetwarzania wierszy, które są szersze niż jeden z wierszy wejściowych podczas przetwarzania zapytania. Wiersze mogą być tak szerokie, że czasami dany operator nie może przetworzyć wiersza. Jeśli wiersze są tak szerokie, aparat bazy danych generuje błąd podczas wykonywania zapytania. Za pomocą polecenia ROBUST PLANpoinstruujesz Optymalizator zapytań, aby nie uwzględniał żadnych planów zapytań, które mogą napotkać ten problem.

Jeśli taki plan nie jest możliwy, optymalizator zapytań zwraca błąd zamiast odroczenia wykrywania błędów w celu wykonania zapytania. Wiersze mogą zawierać kolumny o zmiennej długości; Aparat bazy danych umożliwia zdefiniowanie wierszy, które mają maksymalny potencjalny rozmiar poza możliwości przetwarzania ich przez aparat bazy danych. Ogólnie rzecz biorąc, pomimo maksymalnego potencjalnego rozmiaru aplikacja przechowuje wiersze, które mają rzeczywiste rozmiary w granicach, które aparat bazy danych może przetworzyć. Jeśli aparat bazy danych napotka zbyt długi wiersz, zwracany jest błąd wykonywania.

USE HINT ( 'hint_name' )

Dotyczy: SQL Server (począwszy od programu SQL Server 2016 (13.x) SP1), usługi Azure SQL Database i usługi Azure SQL Managed Instance.

Udostępnia co najmniej jedną dodatkową wskazówkę dla procesora zapytań. Dodatkowe wskazówki są określane z nazwą wskazówki wewnątrz pojedynczych cudzysłowów.

Tip

Nazwy wskazówek są bez uwzględniania wielkości liter.

Obsługiwane są następujące nazwy wskazówek:

Hint Description
'ABORT_QUERY_EXECUTION' Blokuje wykonywanie zapytań. Ma być używana jako wskazówka magazynu zapytań , aby umożliwić administratorom blokowanie przyszłego wykonywania znanych problematycznych zapytań, na przykład nieistotnych zapytań wpływających na obciążenia aplikacji. Aby uzyskać więcej informacji, zobacz Blokuj przyszłe wykonywanie problematycznych zapytań.

Dotyczy: Azure SQL Database i SQL Server 2025 (17.x) Preview. Ta wskazówka jest dostępna w wersji zapoznawczej.
'ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXP' Model szacowania kardynalności dla REGEXP_LIKE zapewnia domyślne wartości wyboru. Użyj tej wskazówki, jeśli szacowanie domyślne jest zbyt wysokie. Ustawia ona selektywność na stałą niższą wartość selektora.

Dotyczy: SQL Server 2025 (17.x) (wersja zapoznawcza i nowsze) oraz Usługa Azure SQL Database
'ASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP' Model szacowania kardynalności dla REGEXP_LIKE zapewnia domyślne wartości wyboru. Użyj tej wskazówki, jeśli szacowanie domyślne jest zbyt niskie. Ustawia ona selektywność na stałą wyższą wartość selektora.

Dotyczy: SQL Server 2025 (17.x) (wersja zapoznawcza i nowsze) oraz Usługa Azure SQL Database
'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS' Generuje plan zapytania przy użyciu założenia prostego zawierania zamiast domyślnego założenia podstawowego zawierania dla sprzężeń w ramach modelu szacowania kardynalności optymalizatora zapytań programu SQL Server 2014 (12.x) i nowszych wersji. Ta nazwa wskazówki jest równoważna flagi śledzenia 9476.
'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES' Generuje plan przy użyciu minimalnej selektywności podczas szacowania i predykatów dla filtrów w celu uwzględnienia pełnej korelacji. Ta nazwa wskazówek jest równoważna flagi Trace Flag 4137 w przypadku użycia z modelem szacowania kardynalności programu SQL Server 2012 (11.x) i jego wcześniejszych wersji oraz ma podobny wpływ, gdy flaga śledzenia flagi 9471 jest używana z modelem szacowania kardynalności programu SQL Server 2014 (12.x) i nowszymi wersjami.
'ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES' Generuje plan przy użyciu maksymalnej selektywności podczas szacowania i predykatów dla filtrów w celu uwzględnienia pełnej niezależności. Ta nazwa wskazówek to domyślne zachowanie modelu szacowania kardynalności programu SQL Server 2012 (11.x) i wcześniejszych wersji oraz odpowiednik flagi śledzenia 9472 w przypadku użycia z modelem szacowania kardynalności programu SQL Server 2014 (12.x) i nowszymi wersjami.

Dotyczy: Azure SQL Database
'ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES' Generuje plan przy użyciu większości do najmniejszej selektywności podczas szacowania predykatów AND dla filtrów do uwzględnienia częściowej korelacji. Ta nazwa wskazówki jest domyślnym zachowaniem modelu szacowania kardynalności programu SQL Server 2014 (12.x) i nowszych wersji.

Dotyczy: Azure SQL Database
'DISABLE_BATCH_MODE_ADAPTIVE_JOINS' Wyłącza sprzężenia adaptacyjne trybu wsadowego. Aby uzyskać więcej informacji, zobacz Tryb wsadowy sprzężenia adaptacyjne.

Dotyczy: SQL Server 2017 (14.x) i nowsze wersje oraz Azure SQL Database
'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK' Wyłącza przekazywanie opinii w trybie wsadowym w trybie wsadowym. Aby uzyskać więcej informacji, zobacz Informacje zwrotne dotyczące przyznawania pamięci w trybie usługi Batch.

Dotyczy: SQL Server 2017 (14.x) i nowsze wersje oraz Azure SQL Database
'DISABLE_DEFERRED_COMPILATION_TV' Wyłącza kompilację odroczonej zmiennej tabeli. Aby uzyskać więcej informacji, zobacz kompilacji zmiennej tabeli odroczonej.

Dotyczy: SQL Server 2019 (15.x) i nowsze wersje oraz Azure SQL Database
'DISABLE_INTERLEAVED_EXECUTION_TVF' Wyłącza przeplatane wykonywanie dla funkcji z wieloma instrukcjami z wartościami tabel. Aby uzyskać więcej informacji, zobacz Interleaved execution for multi-statement table-valued functions (Wykonywanie interleaved dla funkcji z wieloma instrukcjami).

Dotyczy: SQL Server 2017 (14.x) i nowsze wersje oraz Azure SQL Database
'DISABLE_OPTIMIZED_HALLOWEEN_PROTECTION' Wyłącza zoptymalizowaną ochronę Halloween. Aby uzyskać więcej informacji, zobacz Zoptymalizowana ochrona Halloween

Dotyczy: SQL Server 2025 (17.x) Preview
'DISABLE_OPTIMIZED_NESTED_LOOP' Instruuje procesor zapytań, aby nie używał operacji sortowania (sortowania wsadowego) do zoptymalizowanych zagnieżdżonych sprzężeń pętli podczas generowania planu zapytania. Ta nazwa wskazówki jest równoważna flagi śledzenia 2340. Ta wskazówka dotyczy również jawnych sortowania i sortowania wsadowego.
'DISABLE_OPTIMIZER_ROWGOAL' Powoduje, że program SQL Server generuje plan, który nie używa modyfikacji celu wiersza z zapytaniami zawierającymi następujące słowa kluczowe:

- TOP
- OPTION (FAST N)
- IN
- EXISTS

Ta nazwa wskazówki jest równoważna flagi śledzenia 4138.
'DISABLE_PARAMETER_SNIFFING' Nakazuje optymalizatorowi zapytań użycie średniego rozkładu danych podczas kompilowania zapytania z co najmniej jednym parametrem. Ta instrukcja sprawia, że plan zapytania jest niezależny od wartości parametru, która została użyta po raz pierwszy podczas kompilowania zapytania. Ta nazwa wskazówki jest równoważna ustawieniu konfiguracji śledzenia flagi 4136 lub konfiguracjiPARAMETER_SNIFFING = OFFw zakresie bazy danych.
'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK' Wyłącza funkcję przekazywania opinii w trybie wiersza. Aby uzyskać więcej informacji, zobacz Opinie dotyczące udzielania informacji zwrotnych dotyczących pamięci trybu wiersza.

Dotyczy: SQL Server 2019 (15.x) i nowsze wersje oraz Azure SQL Database
'DISABLE_TSQL_SCALAR_UDF_INLINING' Wyłącza podkreślenie funkcji UDF skalarnych. Aby uzyskać więcej informacji, zobacz Scalar UDF Inlining (Scalar UDF Inlining).

Dotyczy: SQL Server 2019 (15.x) i nowsze wersje oraz Azure SQL Database
'DISALLOW_BATCH_MODE' Wyłącza wykonywanie trybu wsadowego. Aby uzyskać więcej informacji, zobacz Tryby wykonywania.

Dotyczy: SQL Server 2019 (15.x) i nowsze wersje oraz Azure SQL Database
'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS' Umożliwia automatyczne generowanie szybkich statystyk (poprawka histogramu) dla dowolnej kolumny indeksu wiodącego, dla której jest potrzebne oszacowanie kardynalności. Histogram używany do szacowania kardynalności jest dostosowywany w czasie kompilacji zapytania, aby uwzględnić rzeczywistą maksymalną lub minimalną wartość tej kolumny. Ta nazwa wskazówki jest równoważna flagi śledzenia 4139.
'ENABLE_OPTIMIZED_HALLOWEEN_PROTECTION' Umożliwia zoptymalizowaną ochronę Halloween. Aby uzyskać więcej informacji, zobacz Zoptymalizowana ochrona Halloween.

Dotyczy: SQL Server 2025 (17.x) Preview
'ENABLE_QUERY_OPTIMIZER_HOTFIXES' Włącza poprawki optymalizatora zapytań (zmiany wydane w aktualizacjach zbiorczych i dodatku Service Pack programu SQL Server). Ta nazwa wskazówki jest równoważna ustawieniu konfiguracji śledzenia flagi 4199 lub konfiguracji QUERY_OPTIMIZER_HOTFIXES = ON.
'FORCE_DEFAULT_CARDINALITY_ESTIMATION' Wymusza, aby optymalizator zapytań używał modelu szacowania kardynalności , który odpowiada bieżącemu poziomowi zgodności bazy danych. Użyj tej wskazówki, aby zastąpić ustawienie LEGACY_CARDINALITY_ESTIMATION = ON lub flagę śledzenia 9481.
'FORCE_LEGACY_CARDINALITY_ESTIMATION' Wymusza użycie modelu szacowania kardynalności programu SQL Server 2012 (11.x) i wcześniejszych wersji optymalizatora zapytań. Ta nazwa wskazówki jest równoważna ustawieniu konfiguracji śledzenia flagi 9481 lub konfiguracji LEGACY_CARDINALITY_ESTIMATION = ON.
'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n' 1 Wymusza zachowanie optymalizatora zapytań na poziomie zapytania. To zachowanie ma miejsce tak, jakby zapytanie zostało skompilowane z poziomem zgodności bazy danych n, gdzie n jest obsługiwanym poziomem zgodności bazy danych. Aby uzyskać listę aktualnie obsługiwanych wartości dla n, zobacz sys.dm_exec_valid_use_hints.

Dotyczy: SQL Server 2017 (14.x) CU 10 i nowsze wersje oraz Azure SQL Database
'QUERY_PLAN_PROFILE' 2 Umożliwia uproszczone profilowanie dla zapytania. Po zakończeniu zapytania zawierającego tę nową wskazówkę zostanie wyzwolone nowe zdarzenie rozszerzone , query_plan_profile. To zdarzenie rozszerzone uwidacznia statystyki wykonywania i rzeczywisty kod XML planu wykonywania podobny do zdarzenia rozszerzonego query_post_execution_showplan , ale tylko w przypadku zapytań zawierających nową wskazówkę.

Dotyczy: SQL Server 2016 (13.x) SP 2 CU 3, SQL Server 2017 (14.x) CU 11 i nowsze wersje
'DISABLE_RESULT_SET_CACHE' Wyłącza buforowanie zestawu wyników (wersja zapoznawcza) dla określonego przebiegu zapytania, jeśli pamięć podręczna zestawu wyników jest włączona dla aktualnie połączonego elementu. Oznacza to, że nie wygeneruje ona ani nowej pamięci podręcznej zestawu wyników, ani nie będzie korzystać z istniejącej pamięci podręcznej zestawu wyników (jeśli istnieje). Może to być przydatne w scenariuszach debugowania lub testowania A/B. Aby uzyskać więcej informacji, zobacz Buforowanie zestawu wyników.

Dotyczy: Microsoft Fabric

1 Wskazówka QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n nie zastępuje domyślnego lub starszego ustawienia szacowania kardynalności, jeśli wymusisz na niej użycie konfiguracji o zakresie bazy danych, flagi śledzenia lub innej wskazówki zapytania, takiej jak QUERYTRACEON. Ta wskazówka wpływa tylko na zachowanie optymalizatora zapytań. Nie ma to wpływu na inne funkcje programu SQL Server, które mogą zależeć od poziomu zgodności bazy danych, takiego jak dostępność niektórych funkcji bazy danych. Aby uzyskać więcej informacji, zobacz Wybór dewelopera: podpowiedź na model wykonywania zapytań.

2 Jeśli włączysz zbieranie zdarzenia rozszerzonego query_post_execution_showplan , standardowa infrastruktura profilowania zostanie dodana do każdego zapytania uruchomionego na serwerze i w związku z tym może mieć wpływ na ogólną wydajność serwera. Jeśli zamiast tego włączysz zbieranie zdarzeń rozszerzonych w celu korzystania z uproszczonej query_thread_profile infrastruktury profilowania, spowoduje to znacznie mniejsze obciążenie związane z wydajnością, ale nadal wpływa na ogólną wydajność serwera. Jeśli włączysz zdarzenie rozszerzone, spowoduje to włączenie tylko uproszczonej query_plan_profile infrastruktury profilowania dla zapytania wykonywanego za pomocą elementu i w związku z query_plan_profile tym nie ma wpływu na inne obciążenia na serwerze. Ta wskazówka umożliwia profilowanie określonego zapytania bez wpływu na inne części obciążenia serwera. Aby uzyskać więcej informacji na temat uproszczonego profilowania, zobacz Infrastruktura profilowania zapytań.

Listę wszystkich obsługiwanych USE HINT nazw można odpytować przy użyciu dynamicznego widoku zarządzania sys.dm_exec_valid_use_hints.

Important

Niektóre USE HINT wskazówki mogą powodować konflikt z flagami śledzenia włączonymi na poziomie globalnym lub sesji albo ustawieniami konfiguracji w zakresie bazy danych. W takim przypadku wskazówka na poziomie zapytania (USE HINT) zawsze ma pierwszeństwo. USE HINT Jeśli wystąpi konflikt z inną wskazówką zapytania lub flagą śledzenia włączoną na poziomie zapytania (np. przez QUERYTRACEON), program SQL Server wygeneruje błąd podczas próby wykonania zapytania.

UŻYJ PLANU N'xml_plan'

Wymusza, aby optymalizator zapytań używał istniejącego planu zapytania dla zapytania określonego przez xml_plan.

Wynikowy plan wykonania wymuszony przez tę funkcję jest taki sam lub podobny do wymuszanego planu. Ponieważ wynikowy plan może nie być identyczny z planem określonym przez USE PLANusługę , wydajność planów może się różnić. W rzadkich przypadkach różnica wydajności może być znacząca i ujemna; w takim przypadku administrator musi usunąć wymuszony plan.

WSKAZÓWKA TABELI ( exposed_object_name [ , <table_hint> [ [ , ] ... n ] ] )

Stosuje określoną wskazówkę tabeli do tabeli lub widoku odpowiadającego exposed_object_name. Zalecamy użycie wskazówki tabeli jako wskazówki dotyczącej zapytania tylko w kontekście przewodnika planu .

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

  • Gdy alias jest używany dla tabeli lub widoku w klauzuli FROM zapytania, exposed_object_name jest aliasem.

  • Jeśli alias nie jest używany, exposed_object_name jest dokładnym dopasowaniem tabeli lub widoku, do którego odwołuje się klauzula FROM . Jeśli na przykład tabela lub widok jest przywołyny przy użyciu dwuczęściowej nazwy, exposed_object_name jest tą samą dwuczęściową nazwą.

Po określeniu exposed_object_name bez określania wskazówki tabeli wszystkie indeksy określone w zapytaniu w ramach wskazówki tabeli dla obiektu zostaną zignorowane. Optymalizator zapytań określa użycie indeksu. Za pomocą tej techniki można wyeliminować efekt INDEX wskazówki tabeli, gdy nie można zmodyfikować oryginalnego zapytania. Zobacz Przykład J.

<table_hint>

NOEXPAND [ , INDEKS ( index_value [ ,... n ] ) | INDEX = ( index_value ) ] | INDEX ( index_value [ ,... n ] ) | INDEX = ( index_value ) | FORCESEEK [ ( index_value ( index_column_name [,... ] ) ] | FORCESCAN | HOLDLOCK | NOLOCK | NOWAIT | STRONICOWANIE | READCOMMITTED | READCOMMITTEDLOCK | READPAST | READUNCOMMITTED | POWTARZALNY ODCZYT | ROWLOCK | SERIALIZABLE | MIGAWKA | SPATIAL_WINDOW_MAX_CELLS = integer_value | TABLOCK | TABLOCKX | UPDLOCK | XLOCK

Wskazówka tabeli, która ma być stosowana do tabeli lub widoku odpowiadającego exposed_object_name jako wskazówki dotyczącej zapytania. Opis tych wskazówek można znaleźć w temacie Wskazówki dotyczące tabel.

Wskazówki dotyczące tabeli inne niż INDEX, FORCESCANi FORCESEEK są niedozwolone jako wskazówki dotyczące zapytań, chyba że zapytanie zawiera już klauzulę określającą WITH wskazówkę tabeli. Aby uzyskać więcej informacji, zobacz sekcję Uwagi.

Caution

Określenie FORCESEEK parametrów ogranicza liczbę planów, które można uznać za bardziej przez Optymalizator zapytań niż podczas określania FORCESEEK bez parametrów. Może to spowodować wystąpienie błędu "Nie można wygenerować planu" w kolejnych przypadkach.

ZNACZNIK CZASU DLA WARTOŚCI "point_in_time"

Dotyczy: Magazyn w usłudze Microsoft Fabric

Składnia TIMESTAMP w klauzuli umożliwia OPTION wykonywanie zapytań o dane w przeszłości w ramach funkcji podróży w usłudze Synapse Data Warehouse w usłudze Microsoft Fabric.

Określ point_in_time w formacie yyyy-MM-ddTHH:mm:ss[.fff] , aby zwracać dane tak, jak zostały wyświetlone w tym czasie. Strefa czasowa jest zawsze w formacie UTC. CONVERT Użyj składni dla niezbędnego formatu daty/godziny ze stylem 126.

Wskazówkę TIMESTAMP AS OF można określić tylko raz przy użyciu klauzuli OPTION . Aby uzyskać więcej informacji i ograniczeń, zobacz Wykonywanie zapytań dotyczących danych w przeszłości.

FORCE [ POJEDYNCZY WĘZEŁ | ROZPROSZONY ] PLAN

Dotyczy: Magazyn w usłudze Microsoft Fabric

Umożliwia użytkownikowi wybranie, czy wymusić plan pojedynczego węzła, czy plan rozproszony na potrzeby wykonywania zapytania.

Remarks

Nie można określić wskazówek dotyczących zapytań w instrukcji INSERT , z wyjątkiem sytuacji, gdy klauzula SELECT jest używana wewnątrz instrukcji .

Wskazówki dotyczące zapytań można określić tylko w zapytaniu najwyższego poziomu, a nie w podzapytaniach. Gdy wskazówka tabeli jest określona jako wskazówka zapytania, wskazówkę można określić w zapytaniu najwyższego poziomu lub w podzapytaniu. Jednak wartość określona dla exposed_object_name w TABLE HINT klauzuli musi odpowiadać dokładnie uwidocznionej nazwie w zapytaniu lub podzapytaniu.

Określanie wskazówek tabeli jako wskazówek dotyczących zapytań

Zalecamy użycie INDEXwskazówki dotyczącej tabeli , FORCESCANlub jako FORCESEEK wskazówki dotyczącej zapytania tylko w kontekście przewodnika planu. Przewodniki dotyczące planu są przydatne, gdy nie można na przykład zmodyfikować oryginalnego zapytania, ponieważ jest to aplikacja innej firmy. Wskazówka dotycząca zapytania określona w przewodniku planu jest dodawana do zapytania przed skompilowanie i zoptymalizowanie. W przypadku zapytań ad hoc użyj klauzuli TABLE HINT tylko wtedy, gdy instrukcje przewodnika po planie testowania. W przypadku wszystkich innych zapytań ad hoc zalecamy określenie tych wskazówek tylko jako wskazówek tabeli.

Po określeniu jako wskazówki INDEXzapytania wskazówki dotyczące tabeli , FORCESCANi FORCESEEK są prawidłowe dla następujących obiektów:

  • Tables
  • Views
  • Indexed views
  • Typowe wyrażenia tabeli (wskazówka musi być określona w instrukcji SELECT , której zestaw wyników wypełnia wspólne wyrażenie tabeli)
  • Dynamiczne widoki zarządzania (DMV)
  • Named subqueries

Wskazówki dotyczące tabel i , i INDEX można określić FORCESCANFORCESEEKjako wskazówki dotyczące zapytań dla zapytania, które nie ma żadnych istniejących wskazówek dotyczących tabeli. Można ich również użyć, aby zastąpić istniejące INDEXFORCESCAN, lub FORCESEEK wskazówek odpowiednio w zapytaniu.

Wskazówki dotyczące tabeli inne niż INDEX, FORCESCANi FORCESEEK są niedozwolone jako wskazówki dotyczące zapytań, chyba że zapytanie zawiera już klauzulę określającą WITH wskazówkę tabeli. W takim przypadku należy również określić zgodną wskazówkę jako wskazówkę zapytania. Określ zgodną wskazówkę jako wskazówkę zapytania, używając TABLE HINT w klauzuli OPTION . Ta specyfikacja zachowuje semantykę zapytania. Jeśli na przykład zapytanie zawiera wskazówkę NOLOCKtabeli , OPTION klauzula w parametrze @hints przewodnika planu musi również zawierać NOLOCK wskazówkę. Zobacz przykład K.

Określanie wskazówek za pomocą wskazówek magazynu zapytań

Wskazówki dotyczące zapytań zidentyfikowanych za pośrednictwem magazynu zapytań można wymusić bez wprowadzania zmian w kodzie przy użyciu funkcji wskazówek magazynu zapytań . Użyj procedury składowanej sys.sp_query_store_set_hints , aby zastosować wskazówkę do zapytania. Zobacz Przykład N.

Obsługa wskazówek dotyczących zapytań w magazynie danych sieci szkieletowej

Magazyn danych usługi Microsoft Fabric obsługuje podzestaw wskazówek dotyczących zapytań:

  • HASH GROUP
  • ORDER GROUP
  • MERGE UNION
  • HASH UNION
  • CONCAT UNION
  • FORCE ORDER
  • USE HINT
    • ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES
    • ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES
    • ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES
    • ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS

Te wskazówki dotyczące zapytań są dostępne wyłącznie w usłudze Microsoft Fabric Data Warehouse:

  • FORCE SINGLE NODE PLAN, , FORCE DISTRIBUTED PLANDISABLE_RESULT_SET_CACHE

Examples

A. Korzystanie z funkcji MERGE JOIN

Poniższy przykład określa, że MERGE JOIN uruchamia operację JOIN w zapytaniu. W przykładzie użyto AdventureWorks2022 bazy danych.

SELECT *
FROM Sales.Customer AS c
INNER JOIN Sales.CustomerAddress AS ca ON c.CustomerID = ca.CustomerID
WHERE TerritoryID = 5
OPTION (MERGE JOIN);
GO

B. Używanie FUNKCJI OPTIMIZE FOR

Poniższy przykład instruuje Optymalizator zapytań, aby używał wartości 'Seattle' i @city_name używa średniego wyboru predykatu we wszystkich wartościach kolumn podczas @postal_code optymalizowania zapytania. W przykładzie użyto AdventureWorks2022 bazy danych.

CREATE PROCEDURE dbo.RetrievePersonAddress
@city_name NVARCHAR(30),
@postal_code NVARCHAR(15)
AS
SELECT * FROM Person.Address
WHERE City = @city_name AND PostalCode = @postal_code
OPTION ( OPTIMIZE FOR (@city_name = 'Seattle', @postal_code UNKNOWN) );
GO

C. Use MAXRECURSION

MAXRECURSION może służyć do zapobiegania źle sformułowanym rekursywnym typowym wyrażeniu tabeli, które wchodzi w nieskończoną pętlę. Poniższy przykład celowo tworzy pętlę nieskończoną i używa MAXRECURSION wskazówki, aby ograniczyć liczbę poziomów rekursji do dwóch. W przykładzie użyto AdventureWorks2022 bazy danych.

--Creates an infinite loop
WITH cte (CustomerID, PersonID, StoreID) AS
(
    SELECT CustomerID, PersonID, StoreID
    FROM Sales.Customer
    WHERE PersonID IS NOT NULL
  UNION ALL
    SELECT cte.CustomerID, cte.PersonID, cte.StoreID
    FROM cte
    JOIN  Sales.Customer AS e
        ON cte.PersonID = e.CustomerID
)
--Uses MAXRECURSION to limit the recursive levels to 2
SELECT CustomerID, PersonID, StoreID
FROM cte
OPTION (MAXRECURSION 2);
GO

Po skorygowaniu MAXRECURSION błędu kodowania nie jest już wymagany.

D. Korzystanie z funkcji MERGE UNION

W poniższym przykładzie użyto MERGE UNION wskazówki dotyczącej zapytania. W przykładzie użyto AdventureWorks2022 bazy danych.

SELECT *
FROM HumanResources.Employee AS e1
UNION
SELECT *
FROM HumanResources.Employee AS e2
OPTION (MERGE UNION);
GO

E. Używanie funkcji HASH GROUP i FAST

W poniższym przykładzie użyto HASH GROUP wskazówek dotyczących zapytań i FAST . W przykładzie użyto AdventureWorks2022 bazy danych.

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

F. Use MAXDOP

W poniższym przykładzie użyto MAXDOP wskazówki dotyczącej zapytania. W przykładzie użyto AdventureWorks2022 bazy danych.

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

G. Use INDEX

W poniższych przykładach użyto INDEX wskazówki. Pierwszy przykład określa pojedynczy indeks. Drugi przykład określa wiele indeksów dla pojedynczej dokumentacji tabeli. W obu przykładach, ponieważ stosujesz INDEX wskazówkę w tabeli korzystającej z aliasu, klauzula TABLE HINT musi również określać ten sam alias co nazwa uwidocznionego obiektu. W przykładzie użyto AdventureWorks2022 bazy danych.

EXEC sp_create_plan_guide
    @name = N'Guide1',
    @stmt = N'SELECT c.LastName, c.FirstName, e.Title
              FROM HumanResources.Employee AS e
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID
              WHERE e.ManagerID = 2;',
    @type = N'SQL',
    @module_or_batch = NULL,
    @params = NULL,
    @hints = N'OPTION (TABLE HINT(e, INDEX (IX_Employee_ManagerID)))';
GO
EXEC sp_create_plan_guide
    @name = N'Guide2',
    @stmt = N'SELECT c.LastName, c.FirstName, e.Title
              FROM HumanResources.Employee AS e
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID
              WHERE e.ManagerID = 2;',
    @type = N'SQL',
    @module_or_batch = NULL,
    @params = NULL,
    @hints = N'OPTION (TABLE HINT(e, INDEX(PK_Employee_EmployeeID, IX_Employee_ManagerID)))';
GO

H. Use FORCESEEK

W poniższym przykładzie użyto FORCESEEK wskazówki tabeli. Klauzula TABLE HINT musi również określać tę samą nazwę dwuczęściową co nazwa uwidocznionej obiektu. Określ nazwę podczas stosowania INDEX wskazówki w tabeli, która używa nazwy dwuczęściowej. W przykładzie użyto AdventureWorks2022 bazy danych.

EXEC sp_create_plan_guide
    @name = N'Guide3',
    @stmt = N'SELECT c.LastName, c.FirstName, HumanResources.Employee.Title
              FROM HumanResources.Employee
              JOIN Person.Contact AS c ON HumanResources.Employee.ContactID = c.ContactID
              WHERE HumanResources.Employee.ManagerID = 3
              ORDER BY c.LastName, c.FirstName;',
    @type = N'SQL',
    @module_or_batch = NULL,
    @params = NULL,
    @hints = N'OPTION (TABLE HINT( HumanResources.Employee, FORCESEEK))';
GO

I. Korzystanie z wielu wskazówek tabeli

Poniższy przykład stosuje INDEX wskazówkę do jednej tabeli i FORCESEEK wskazówkę do innej. W przykładzie użyto AdventureWorks2022 bazy danych.

EXEC sp_create_plan_guide
    @name = N'Guide4',
    @stmt = N'SELECT e.ManagerID, c.LastName, c.FirstName, e.Title
              FROM HumanResources.Employee AS e
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID
              WHERE e.ManagerID = 3;',
    @type = N'SQL',
    @module_or_batch = NULL,
    @params = NULL,
    @hints = N'OPTION (TABLE HINT (e, INDEX( IX_Employee_ManagerID))
                       , TABLE HINT (c, FORCESEEK))';
GO

J. Zastępowanie istniejącej wskazówki tabeli za pomocą WSKAZÓWKI TABELI

W poniższym przykładzie pokazano, jak używać TABLE HINT wskazówki. Wskazówkę można użyć bez określania wskazówki, aby zastąpić INDEX zachowanie wskazówki tabeli określone w FROM klauzuli zapytania. W przykładzie użyto AdventureWorks2022 bazy danych.

EXEC sp_create_plan_guide
    @name = N'Guide5',
    @stmt = N'SELECT e.ManagerID, c.LastName, c.FirstName, e.Title
              FROM HumanResources.Employee AS e WITH (INDEX (IX_Employee_ManagerID))
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID
              WHERE e.ManagerID = 3;',
    @type = N'SQL',
    @module_or_batch = NULL,
    @params = NULL,
    @hints = N'OPTION (TABLE HINT(e))';
GO

K. Określanie semantyki wpływających na wskazówki dotyczące tabeli

Poniższy przykład zawiera dwie wskazówki dotyczące tabeli w zapytaniu: NOLOCK, który ma wpływ semantyczny i INDEX, który nie ma wpływu na semantyczną. Aby zachować semantyka zapytania, NOLOCK wskazówka jest określona w OPTIONS klauzuli przewodnika planu. Wraz z NOLOCK wskazówką określ INDEX wskazówki i i FORCESEEK zastąp niesemantytyczną wskazówkę wpływającą na INDEX kwerendę podczas kompilacji i optymalizacji instrukcji. W przykładzie użyto AdventureWorks2022 bazy danych.

EXEC sp_create_plan_guide
    @name = N'Guide6',
    @stmt = N'SELECT c.LastName, c.FirstName, e.Title
              FROM HumanResources.Employee AS e
                   WITH (NOLOCK, INDEX (PK_Employee_EmployeeID))
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID
              WHERE e.ManagerID = 3;',
    @type = N'SQL',
    @module_or_batch = NULL,
    @params = NULL,
    @hints = N'OPTION (TABLE HINT (e, INDEX(IX_Employee_ManagerID), NOLOCK, FORCESEEK))';
GO

W poniższym przykładzie przedstawiono alternatywną metodę zachowania semantyki zapytania i umożliwienie optymalizatorowi wyboru indeksu innego niż indeks określony w wskazówce tabeli. Zezwól optymalizatorowi na wybranie, określając NOLOCK wskazówkę w klauzuli OPTIONS . Należy określić wskazówkę, ponieważ ma ona wpływ semantyczny. Następnie określ TABLE HINT słowo kluczowe z odwołaniem tylko do tabeli i bez INDEX wskazówki. W przykładzie użyto AdventureWorks2022 bazy danych.

EXEC sp_create_plan_guide
    @name = N'Guide7',
    @stmt = N'SELECT c.LastName, c.FirstName, e.Title
              FROM HumanResources.Employee AS e
                   WITH (NOLOCK, INDEX (PK_Employee_EmployeeID))
              JOIN Person.Contact AS c ON e.ContactID = c.ContactID
              WHERE e.ManagerID = 2;',
    @type = N'SQL',
    @module_or_batch = NULL,
    @params = NULL,
    @hints = N'OPTION (TABLE HINT (e, NOLOCK))';
GO

L. Użyj WSKAZÓWKI UŻYCIA

W poniższym przykładzie użyto RECOMPILE wskazówek dotyczących zapytań i USE HINT . W przykładzie użyto AdventureWorks2022 bazy danych.

SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (RECOMPILE, USE HINT ('ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES', 'DISABLE_PARAMETER_SNIFFING'));
GO

M. Korzystanie z FUNKCJI QUERYTRACEON HINT

W poniższym przykładzie użyto QUERYTRACEON wskazówek dotyczących zapytań. W przykładzie użyto AdventureWorks2022 bazy danych. Można włączyć wszystkie poprawki wpływające na plan kontrolowane przez flagę śledzenia 4199 dla określonego zapytania przy użyciu następującego zapytania:

SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (QUERYTRACEON 4199);

Można również użyć wielu flag śledzenia, jak w następującym zapytaniu:

SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION  (QUERYTRACEON 4199, QUERYTRACEON 4137);

N. Korzystanie z wskazówek dotyczących magazynu zapytań

Funkcja wskazówek magazynu zapytań zapewnia łatwą w użyciu metodę kształtowania planów zapytań bez zmieniania kodu aplikacji.

Najpierw zidentyfikuj zapytanie, które zostało już wykonane w widokach wykazu magazynu zapytań, na przykład:

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 ListingPrice DESC%'
  AND query_sql_text not like N'%query_store%';
GO

Poniższy przykład stosuje wskazówkę, aby wymusić starsze narzędzie do szacowania kardynalności do query_id 39 zidentyfikowane w magazynie zapytań:

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

Poniższy przykład stosuje wskazówkę w celu wymuszenia maksymalnego rozmiaru przydziału pamięci w PERCENT skonfigurowanym limicie pamięci do query_id 39 zidentyfikowanych w magazynie zapytań:

EXEC sys.sp_query_store_set_hints @query_id = 39, @query_hints = N'OPTION (MAX_GRANT_PERCENT = 10)';

Poniższy przykład stosuje wiele wskazówek dotyczących zapytań do query_id 39, w tym RECOMPILE, MAXDOP 1i programu SQL Server 2012 (11.x) zachowania optymalizatora zapytań:

EXEC sys.sp_query_store_set_hints @query_id = 39,
    @query_hints = N'OPTION(RECOMPILE, MAXDOP 1, USE HINT (''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_110''))';

Poniższy przykład blokuje wykonywanie zapytania za pomocą query_id 39 z przyszłego ABORT_QUERY_EXECUTION wykonania, stosując wskazówkę. Wskazówka jest dostępna w wersji zapoznawczej.

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

O. Wykonywanie zapytań o dane w określonym punkcie w czasie

Dotyczy: Magazyn w usłudze Microsoft Fabric

Składnia TIMESTAMP w klauzuli umożliwia OPTION wykonywanie zapytań dotyczących danych w przeszłości w usłudze Synapse Data Warehouse w usłudze Microsoft Fabric. Następujące przykładowe zapytanie zwraca dane, które pojawiły się 13 marca 2024 r. o 19:39:35.28 UTC. Strefa czasowa jest zawsze w formacie UTC.

SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey
OPTION (FOR TIMESTAMP AS OF '2024-03-13T19:39:35.28');--March 13, 2024 at 7:39:35.28 PM UTC

P. Zapytanie wymusza pojedynczego węzła lub zapytania rozproszonego

Dotyczy: Magazyn w usłudze Microsoft Fabric

Aby wymusić użycie pojedynczego węzła zapytania w usłudze Fabric Data Warehouse, użyj polecenia FORCE [ SINGLE NODE | DISTRIBUTED ] WSKAZÓWKA PLANU .

SELECT OrderDateKey, SalesAmount
FROM FactInternetSales
OPTION (FORCE SINGLE NODE PLAN);

Aby wymusić użycie zapytania rozproszonego w magazynie danych sieci szkieletowej:

SELECT OrderDateKey, SalesAmount
FROM FactInternetSales
OPTION (FORCE DISTRIBUTED PLAN);

Q. Wyłączanie zapytania z tworzenia lub stosowania pamięci podręcznej zestawu wyników (wersja zapoznawcza)

Dotyczy: Microsoft Fabric

Użyj 'DISABLE_RESULT_SET_CACHE' jako elementu hint_name , aby zablokować pamięć podręczną zestawu wyników dla określonego uruchomienia zapytania. Aby uzyskać więcej informacji, zobacz Buforowanie zestawu wyników.

SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey
OPTION (USE HINT ('DISABLE_RESULT_SET_CACHE'));