Sdílet prostřednictvím


Rady dotazů (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed Instancekoncový bod analytiky SQL v Microsoft FabricWarehouse v Microsoft Fabricdatabázi SQL v Microsoft Fabric

Nápovědy dotazu určují, že se uvedené rady používají v oboru dotazu. Ovlivňují všechny operátory v příkazu. Pokud UNION je součástí hlavního dotazu, může klauzuli obsahovat OPTION pouze poslední dotaz zahrnující UNION operaci. Nápovědy dotazu jsou určeny jako součást klauzule OPTION. K chybě 8622 dochází v případě, že jeden nebo více tipů dotazu způsobí, že Optimalizátor dotazů nevygeneruje platný plán.

Upozornění

Vzhledem k tomu, že optimalizátor dotazů SQL Serveru obvykle vybírá nejlepší plán provádění dotazu, doporučujeme jako poslední možnost použít pouze rady pro zkušené vývojáře a správce databází.

platí pro:

Transact-SQL konvence syntaxe

Syntaxe

<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
}

Argumenty

{ HASH | ORDER } GROUP

Určuje, že agregace, které popisuje dotaz GROUP BY nebo DISTINCT klauzule, by měly používat hashování nebo řazení.

  • Obecně platí, že algoritmus založený na hodnotě hash může zlepšit výkon dotazů, které zahrnují velké nebo složité sady seskupení.
  • Obecně platí, že algoritmus založený na řazení může zlepšit výkon dotazů, které zahrnují malé nebo jednoduché sady seskupení.

{ MERGE | HASH | CONCAT } UNION

Určuje, že se všechny UNION operace spouštějí sloučením, hashováním nebo zřetězením UNION sad. Pokud je zadáno více než jeden UNION tip, optimalizátor dotazů vybere z uvedených tipů nejnákladnější strategii.

  • Obecně platí, že operace algoritmu založeného na sloučení může zlepšit výkon dotazů, které zahrnují seřazené vstupy.
  • Obecně platí, že algoritmus založený na hodnotě hash může zlepšit výkon dotazů, které zahrnují neseřazené nebo velké vstupy.
  • Obecně platí, že algoritmus založený na zřetězení může zlepšit výkon dotazů, které zahrnují odlišné nebo malé vstupy.

{ LOOP | MERGE | HASH } JOIN

Určuje, že všechny operace spojení provádí LOOP JOIN, MERGE JOINnebo HASH JOIN v celém dotazu. Pokud zadáte více než jednu nápovědu pro spojení, optimalizátor vybere z povolených strategií nejnákladnější strategii spojení.

Pokud pro konkrétní dvojici tabulek zadáte nápovědu spojení ve stejné klauzuli dotazu FROM , má tento tip spojení přednost před spojením obou tabulek. Přesto musí být dodrženy rady pro dotazy. Tip spojení pro dvojici tabulek může omezit pouze výběr povolených metod spojení v nápovědě dotazu. Další informace najdete v nápovědě ke spojení.

DISABLE_OPTIMIZED_PLAN_FORCING

platí pro: SQL Server (počínaje SQL Serverem 2022 (16.x))

Zakáže optimalizovaný plán vynucení dotazu.

Optimalizovaný plán vynucuje snížení režie kompilace pro opakující se vynucené dotazy. Jakmile se vygeneruje plán spouštění dotazů, uloží se konkrétní kroky kompilace pro opakované použití jako skript pro přehrání optimalizace. Skript pro přehrání optimalizace je uložen jako součást komprimovaného souboru XML plánu showplan v úložiště dotazů, ve skrytém atributu OptimizationReplay.

ROZBALIT ZOBRAZENÍ

Určuje, že se indexovaná zobrazení rozbalí. Určuje také, že optimalizátor dotazů nebere v úvahu žádné indexované zobrazení jako náhradu za jakoukoli část dotazu. Zobrazení se rozbalí, když definice zobrazení nahradí název zobrazení v textu dotazu.

Tento dotaz prakticky zakáže přímé použití indexovaných zobrazení a indexů v indexovaných zobrazeních v plánu dotazu.

Poznámka:

Indexované zobrazení zůstává zhuštěné, pokud je v části dotazu SELECT přímý odkaz na zobrazení. Zobrazení zůstává také zhuštěno, pokud zadáte WITH (NOEXPAND) nebo WITH (NOEXPAND, INDEX( <index_value> [ , *...n* ] ) ). Další informace o nápovědě NOEXPANDk dotazu naleznete v tématu Použití funkce NOEXPAND.

Nápověda má vliv pouze na zobrazení v části příkazů SELECT , včetně těchto zobrazení v INSERT, UPDATE, MERGEa DELETE příkazů.

FAST integer_value

Určuje, že dotaz je optimalizovaný pro rychlé načtení prvního integer_value počtu řádků. Tento výsledek je nezáporné celé číslo. Jakmile se vrátí první integer_value počet řádků, dotaz pokračuje v provádění a vytvoří úplnou sadu výsledků.

FORCE ORDER

Určuje, že pořadí spojení označené syntaxí dotazu se během optimalizace dotazu zachová. Použití FORCE ORDER nemá vliv na možné chování optimalizátoru dotazů.

FORCE ORDER zachová pořadí spojení zadané v dotazu, které může zlepšit výkon nebo konzistenci dotazů, které zahrnují složité podmínky spojení nebo rady.

Poznámka:

MERGE V příkazu je zdrojová tabulka přístupná před cílovou tabulkou jako výchozí pořadí spojení, pokud WHEN SOURCE NOT MATCHED není zadaná klauzule. Zadání FORCE ORDER zachovává toto výchozí chování.

{ FORCE | DISABLE } EXTERNALPUSHDOWN

Vynuťte nebo zakažte posun výpočtů opravňujících výrazů v Hadoopu. Platí pouze pro dotazy používající PolyBase. Nenasdílí se do úložiště Azure.

{ FORCE | DISABLE } SCALEOUTEXECUTION

Vynuťte nebo zakažte spouštění dotazů PolyBase, které používají externí tabulky v clusterech s velkými objemy dat SQL Serveru 2019. Tento tip je dodržen pouze dotazem, který používá hlavní instanci clusteru SQL Pro velké objemy dat. Horizontální navýšení kapacity probíhá napříč výpočetním fondem clusteru s velkými objemy dat.

KEEP PLAN

Změní prahové hodnoty rekompilace dočasných tabulek a vytvoří je stejně jako prahové hodnoty pro trvalé tabulky. Odhadovaná prahová hodnota rekompilu spustí automatické překompilování dotazu, když se v tabulce provede odhadovaný počet změn indexovaného sloupce spuštěním jednoho z následujících příkazů:

  • UPDATE
  • DELETE
  • MERGE
  • INSERT

Zadání KEEP PLAN zajistí, aby se dotaz nepřekompiloval tak často, když je v tabulce více aktualizací.

KEEPFIXED PLAN

Vynutí optimalizátor dotazů, aby dotaz nepřekompilovat kvůli změnám ve statistikách. Zadání KEEPFIXED PLAN zajistí, že se dotaz znovu zkompilí pouze v případě, že se změní schéma podkladových tabulek nebo pokud sp_recompile se spustí v těchto tabulkách.

IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX

Platí pro: SQL Server (počínaje SQL Serverem 2012 (11.x)).

Zabrání dotazu v použití neclusterovaného indexu columnstore optimalizovaného pro paměť. Pokud dotaz obsahuje nápovědu k dotazu, aby se zabránilo použití indexu columnstore a nápovědě indexu pro použití indexu columnstore, jsou rady v konfliktu a dotaz vrátí chybu.

MAX_GRANT_PERCENT = <numeric_value>

Platí pro: SQL Server (počínaje aktualizací SQL Server 2012 (11.x) Service Pack 3, SQL Server 2014 (12.x) Service Pack 2 a Azure SQL Database.

Maximální velikost přidělení paměti v PERCENT nakonfigurovaných limitech paměti. Pokud dotaz běží v uživatelem definovaném fondu zdrojů, není zaručeno, že tento limit nepřekročí. V takovém případě pokud dotaz nemá minimální požadovanou paměť, systém vyvolá chybu. Pokud je dotaz spuštěný ve fondu systému (výchozí), získá minimálně paměť potřebnou ke spuštění. Skutečný limit může být nižší, pokud je nastavení Správce prostředků nižší než hodnota zadaná tímto tipem. Platné hodnoty jsou mezi 0,0 a 100,0.

Nápověda pro udělení paměti není k dispozici pro vytvoření indexu nebo opětovné sestavení indexu.

MIN_GRANT_PERCENT = <numeric_value>

Platí pro: SQL Server (počínaje aktualizací SQL Server 2012 (11.x) Service Pack 3, SQL Server 2014 (12.x) Service Pack 2 a Azure SQL Database.

Minimální velikost přidělení paměti v PERCENT nakonfigurovaných limitech paměti. Dotaz je zaručený, MAX(required memory, min grant) protože k spuštění dotazu je potřeba alespoň požadovaná paměť. Platné hodnoty jsou mezi 0,0 a 100,0.

Možnost udělení paměti min_grant_percent přepíše sp_configure možnost (minimální paměť na dotaz (kB) bez ohledu na velikost. Nápověda pro udělení paměti není k dispozici pro vytvoření indexu nebo opětovné sestavení indexu.

INTEGER_VALUE MAXDOP <>

Platí pro: SQL Server (počínaje SQL Serverem 2008 (10.0.x)) a službou Azure SQL Database.

Přepíše maximální stupeň konfigurace paralelismu možnost sp_configure. Také přepíše správce prostředků pro dotaz určující tuto možnost. Tip MAXDOP dotazu může překročit hodnotu nakonfigurovanou pro sp_configure. Pokud MAXDOP překročí hodnotu nakonfigurovanou správcem prostředků, použije databázový stroj hodnotu Správce MAXDOP prostředků popsanou ve skupině ALTER WORKLOAD GROUP. Všechna sémantická pravidla používaná s maximálním stupněm konfigurace paralelismu se použijí při použití nápovědy MAXDOP k dotazu. Další informace najdete v tématu Konfigurace maximálního stupně paralelismu Možnosti konfigurace serveru.

Výstraha

Pokud MAXDOP je nastavená na nulu, server zvolí maximální stupeň paralelismu.

INTEGER_VALUE MAXRECURSION <>

Určuje maximální počet rekurzí povolených pro tento dotaz. Argument číslo je kladné celé číslo od 0 do 32 767. Při zadání hodnoty 0 se nepoužije žádný limit. Pokud tato možnost není zadaná, výchozí limit pro server je 100.

Když se během provádění dotazu dosáhne zadaného nebo výchozího čísla limitu MAXRECURSION , dotaz skončí a vrátí chybu.

Z důvodu této chyby jsou všechny účinky příkazu vráceny zpět. Pokud je příkaz příkazem SELECT , můžou se vrátit částečné výsledky nebo žádné výsledky. Vrácené částečné výsledky nemusí zahrnovat všechny řádky na úrovních rekurze nad zadanou maximální rekurzní úrovní.

Další informace najdete v tématu WITH common_table_expression.

NO_PERFORMANCE_SPOOL

Platí pro: SQL Server (počínaje SQL Serverem 2016 (13.x)) a službou Azure SQL Database.

Zabrání přidání operátoru zařazování do plánů dotazů (s výjimkou plánů, pokud je fond nutný k zajištění platné sémantiky aktualizace). Operátor zařazování může v některých scénářích snížit výkon. Například fond používá tempdba tempdb kolize může nastat, pokud existuje mnoho souběžných dotazů spuštěných s operacemi zařazování.

OPTIMIZE FOR ( @variable_name { UNKNOWN | = <literal_constant> } [ , ... n ] )

Dává optimalizátoru dotazů pokyn, aby při kompilaci a optimalizaci dotazu použil konkrétní hodnotu pro místní proměnnou. Hodnota se používá pouze při optimalizaci dotazu, a ne během provádění dotazu.

  • @variable_name

    Název místní proměnné použité v dotazu, ke kterému je možné přiřadit hodnotu pro použití s nápovědou OPTIMIZE FOR k dotazu.

  • UNKNOWN

    Určuje, že Optimalizátor dotazů používá statistická data místo počáteční hodnoty k určení hodnoty pro místní proměnnou během optimalizace dotazu.

  • literal_constant

    Hodnota literálové konstanty, která se má přiřadit @variable_name pro použití s nápovědou OPTIMIZE FOR k dotazu. literal_constant se používá pouze při optimalizaci dotazů, a ne jako hodnota @variable_name během provádění dotazu. literal_constant může být libovolného systémového datového typu SQL Serveru, který lze vyjádřit jako literálovou konstantu. Datový typ literal_constant musí být implicitně konvertibilní na datový typ, který @variable_name odkazy v dotazu.

OPTIMIZE FOR může tlačit výchozí chování detekce parametrů optimalizátoru. Můžete také použít OPTIMIZE FOR při vytváření průvodců plánem. Další informace naleznete v tématu Rekompilovat uloženou proceduru.

OPTIMALIZACE PRO NEZNÁMÉ

Dává optimalizátoru dotazů pokyn, aby při kompilaci a optimalizaci dotazu použil průměrnou selektivitu predikátu ve všech hodnotách sloupců místo použití hodnoty parametru runtime.

Pokud používáte OPTIMIZE FOR @variable_name = <literal_constant> a OPTIMIZE FOR UNKNOWN používáte stejnou nápovědu k dotazu, použije optimalizátor dotazů literal_constant určenou pro konkrétní hodnotu. Optimalizátor dotazů používá funkci UNKNOWN pro zbývající hodnoty proměnných. Hodnoty se používají pouze při optimalizaci dotazů, a ne během provádění dotazu.

PARAMETRIZACE { SIMPLE | FORCED }

Určuje pravidla parametrizace, která optimalizátor dotazů SQL Serveru platí pro dotaz při kompilaci.

Důležité

Nápovědu PARAMETERIZATION dotazu je možné zadat pouze v průvodci plánem, aby se přepsaly aktuální nastavení PARAMETERIZATION možnosti databáze SET . Nedá se zadat přímo v dotazu.

Další informace naleznete v tématu Určení chování parametrizace dotazu pomocí průvodců plánem.

SIMPLE dává optimalizátoru dotazů pokyn k pokusu o jednoduchou parametrizaci. FORCED dává optimalizátoru dotazů pokyn k pokusu o vynucené parametrizace. Další informace naleznete v tématu Vynucené parametrizace v Průvodci architekturou zpracování dotazů a jednoduché parametrizace v Průvodci architekturou zpracování dotazů.

INTEGER_VALUE QUERYTRACEON <>

Tato možnost umožňuje povolit příznak trasování ovlivňující plán pouze během kompilace s jedním dotazem. Podobně jako u jiných možností na úrovni dotazu ho můžete použít společně s vodítky plánu tak, aby odpovídaly textu dotazu spouštěného z jakékoli relace, a při kompilaci tohoto dotazu automaticky použít příznak trasování, který má vliv na plán. Tato QUERYTRACEON možnost je podporovaná pouze pro příznaky trasování Optimalizátoru dotazů. Další informace najdete v tématu příznaky trasování.

Použití této možnosti nevrací žádnou chybu nebo upozornění, pokud se použije nepodporované číslo příznaku trasování. Pokud zadaný příznak trasování není ten, který má vliv na plán provádění dotazu, je tato možnost bezobslužně ignorována.

Pokud chcete v dotazu použít více než jeden příznak trasování, zadejte jeden QUERYTRACEON tip pro každé jiné číslo příznaku trasování.

PŘEKOMPILOVAT

Dává databázovému stroji SQL Serveru pokyn, aby vygeneroval nový dočasný plán dotazu a okamžitě tento plán zahodil po dokončení provádění dotazu. Vygenerovaný plán dotazů nenahrazuje plán uložený v mezipaměti, když se stejný dotaz spustí bez nápovědy RECOMPILE . Bez zadání RECOMPILEukládá databázový stroj plány dotazů do mezipaměti a znovu je používá. Při kompilaci RECOMPILE plánů dotazů se v nápovědě dotazu používají aktuální hodnoty všech místních proměnných v dotazu. Pokud je dotaz uvnitř uložené procedury, aktuální hodnoty předané všem parametrům.

RECOMPILE je užitečná alternativa k vytvoření uložené procedury. RECOMPILE WITH RECOMPILE používá klauzuli, pokud musí být rekompilována pouze podmnožina dotazů uvnitř uložené procedury, nikoli celá uložená procedura. Další informace naleznete v tématu Rekompilovat uloženou proceduru. RECOMPILE je také užitečný při vytváření průvodců plánem.

ROBUSTNÍ PLÁN

Vynutí Optimalizátor dotazů vyzkoušet plán, který funguje pro maximální možnou velikost řádku, pravděpodobně na úkor výkonu. Při zpracování dotazu můžou být přechodné tabulky a operátory muset při zpracování dotazu ukládat a zpracovávat řádky, které jsou širší než kterýkoli ze vstupních řádků. Řádky můžou být tak široké, že konkrétní operátor někdy nemůže řádek zpracovat. Pokud jsou řádky široké, databázový stroj během provádění dotazu vyvolá chybu. Pomocí příkazu ROBUST PLANoptimalizátoru dotazů neberete v úvahu žádné plány dotazů, které by mohly narazit na tento problém.

Pokud takový plán není možný, vrátí optimalizátor dotazů místo odložení detekce chyb provádění dotazů chybu. Řádky mohou obsahovat sloupce s proměnnou délkou; Databázový stroj umožňuje definovat řádky, které mají maximální možnou velikost nad rámec schopnosti databázového stroje je zpracovat. Obecně platí, že i přes maximální možnou velikost aplikace ukládá řádky, které mají skutečné velikosti v mezích, které databázový stroj může zpracovat. Pokud databázový stroj narazí na řádek, který je příliš dlouhý, vrátí se chyba spuštění.

USE HINT ( 'hint_name' )

Platí pro: SQL Server (počínaje SQL Serverem 2016 (13.x) SP1), Azure SQL Database a Azure SQL Managed Instance.

Poskytuje jeden nebo více dalších tipů pro procesor dotazů. Další rady se zadají s názvem nápovědy uvnitř jednoduchých uvozovek.

Návod

Názvy nápovědy nerozlišují malá a velká písmena.

Podporují se následující názvy nápovědy:

Náznak Popis
'ABORT_QUERY_EXECUTION' Blokuje provádění dotazů. Cílem je použít jako nápovědu k úložišti dotazů , aby správci mohli blokovat budoucí spouštění známých problematických dotazů, například nesprávné dotazy, které mají vliv na úlohy aplikace. Další informace najdete v tématu Blokování budoucího provádění problematických dotazů.

Platí pro: Azure SQL Database a SQL Server 2025 (17.x) Preview. Tento tip je ve verzi Preview.
'ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXP' Model odhadu kardinality pro REGEXP_LIKE poskytuje výchozí hodnoty selektivity. Tuto nápovědu použijte, pokud je výchozí odhad příliš vysoký. Nastaví selektivitu na pevnou nižší selektivitu.

Platí pro: SQL Server 2025 (17.x) Preview a novější verze a Azure SQL Database
'ASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP' Model odhadu kardinality pro REGEXP_LIKE poskytuje výchozí hodnoty selektivity. Tento tip použijte, pokud je výchozí odhad příliš nízký. Nastaví selektivitu na pevnou vyšší selektivitu.

Platí pro: SQL Server 2025 (17.x) Preview a novější verze a Azure SQL Database
'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS' Vygeneruje plán dotazu s použitím předpokladu jednoduchého zahrnutí místo výchozího základního omezení pro spojení v rámci modelu odhadu kardinality optimalizátoru dotazů SQL Serveru 2014 (12.x) a novějších verzí. Tento název nápovědy odpovídá příznaku trasování 9476.
'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES' Vygeneruje plán s minimální selektivitou při odhadu predikátů AND pro filtry, které budou zohledňovat úplnou korelaci. Tento název nápovědy je ekvivalentní příznaku trasování 4137 při použití s modelem odhadu kardinality SYSTÉMU SQL Server 2012 (11.x) a starších verzí a má podobný účinek, když se příznak trasování 9471 používá s modelem odhadu kardinality SQL Serveru 2014 (12.x) a novějšími verzemi.
'ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES' Vygeneruje plán s maximální selektivitou při odhadu predikátů AND pro filtry, které budou zohledňovat plnou nezávislost. Tento název nápovědy je výchozím chováním modelu odhadu kardinality systému SQL Server 2012 (11.x) a starších verzí a ekvivalentem příznaku trasování 9472 při použití s modelem odhadu kardinality SQL Serveru 2014 (12.x) a novějšími verzemi.

platí pro: Azure SQL Database
'ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES' Vygeneruje plán, který používá nejvíce k nejnižší selektivitě při odhadu predikátů AND pro filtry, které budou zohledňovat částečnou korelaci. Tento název nápovědy je výchozím chováním modelu odhadu kardinality systému SQL Server 2014 (12.x) a novějších verzí.

platí pro: Azure SQL Database
'DISABLE_BATCH_MODE_ADAPTIVE_JOINS' Zakáže adaptivní spojení v dávkovém režimu. Další informace najdete v tématu Adaptivní spojení v režimu Batch.

platí pro: SQL Server 2017 (14.x) a novější verze a Azure SQL Database
'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK' Zakáže zpětnou vazbu k udělení paměti v dávkovém režimu. Další informace naleznete v tématu Dávkové režim paměti udělovat zpětnou vazbu.

platí pro: SQL Server 2017 (14.x) a novější verze a Azure SQL Database
'DISABLE_DEFERRED_COMPILATION_TV' Zakáže odloženou kompilaci proměnné tabulky. Další informace najdete v tématu odložené kompilace proměnné tabulky.

platí pro: SQL Server 2019 (15.x) a novější verze a Azure SQL Database
'DISABLE_INTERLEAVED_EXECUTION_TVF' Zakáže prokládání provádění pro funkce tabulek s více příkazy. Další informace naleznete v tématu Prokládání provádění pro funkce tabulek s více příkazy.

platí pro: SQL Server 2017 (14.x) a novější verze a Azure SQL Database
'DISABLE_OPTIMIZED_HALLOWEEN_PROTECTION' Zakáže optimalizovanou ochranu Halloween. Další informace naleznete v tématu Optimalizovaná halloween ochrana

Platí pro: SQL Server 2025 (17.x) Preview
'DISABLE_OPTIMIZED_NESTED_LOOP' Dává procesoru dotazů pokyn, aby při generování plánu dotazu nepoužít operaci řazení (dávkové řazení) pro optimalizovaná spojení vnořených smyček. Tento název nápovědy je ekvivalentní příznaku trasování 2340. Tento tip platí také pro explicitní řazení a dávkové řazení.
'DISABLE_OPTIMIZER_ROWGOAL' Způsobí, že SQL Server vygeneruje plán, který nepoužívá úpravy cíle řádku s dotazy, které obsahují tato klíčová slova:

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

Tento název nápovědy odpovídá příznaku trasování 4138.
'DISABLE_PARAMETER_SNIFFING' Dává optimalizátoru dotazů pokyn, aby při kompilaci dotazu použil průměrnou distribuci dat s jedním nebo více parametry. Tato instrukce zpřístupňuje plán dotazu nezávisle na hodnotě parametru, která se poprvé použila při kompilaci dotazu. Tento název nápovědy je ekvivalentní nastavení PARAMETER_SNIFFING = OFFkonfigurace příznaku trasování 4136 nebo databáze s vymezeným oborem .
'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK' Zakáže zpětnou vazbu v režimu řádků. Další informace najdete v tématu o udělení zpětné vazby v režimu řádků.

platí pro: SQL Server 2019 (15.x) a novější verze a Azure SQL Database
'DISABLE_TSQL_SCALAR_UDF_INLINING' Zakáže inlineing skalárního definovaného uživatelem. Další informace najdete v tématu Inlining skalárních funkcí definované uživatelem.

platí pro: SQL Server 2019 (15.x) a novější verze a Azure SQL Database
'DISALLOW_BATCH_MODE' Zakáže provádění dávkového režimu. Další informace naleznete v tématu Režimy provádění.

platí pro: SQL Server 2019 (15.x) a novější verze a Azure SQL Database
'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS' Umožňuje automaticky generovat rychlé statistiky (dodatek histogramu) pro libovolný úvodní indexový sloupec, pro který je potřebný odhad kardinality. Histogram použitý k odhadu kardinality se upraví v době kompilace dotazu tak, aby odpovídal skutečnému maximu nebo minimální hodnotě tohoto sloupce. Tento název nápovědy odpovídá příznaku trasování 4139.
'ENABLE_OPTIMIZED_HALLOWEEN_PROTECTION' Umožňuje optimalizovanou ochranu Halloween. Další informace naleznete v tématu Optimalizovaná Halloween ochrana.

Platí pro: SQL Server 2025 (17.x) Preview
'ENABLE_QUERY_OPTIMIZER_HOTFIXES' Povolí opravy hotfix optimalizátoru dotazů (změny vydané v kumulativních aktualizacích a aktualizacích Service Pack systému SQL Server). Tento název nápovědy je ekvivalentní nastavení QUERY_OPTIMIZER_HOTFIXES = ONkonfigurace příznaku trasování 4199 nebo databáze s vymezeným oborem .
'FORCE_DEFAULT_CARDINALITY_ESTIMATION' Vynutí optimalizátoru dotazů použití modelu odhadu kardinality , který odpovídá aktuální úrovni kompatibility databáze. Tento tip použijte k přepsání nastavení LEGACY_CARDINALITY_ESTIMATION = ONkonfigurace s vymezeným oborem databáze nebo příznaku trasování 9481.
'FORCE_LEGACY_CARDINALITY_ESTIMATION' Vynutí optimalizátoru dotazů použití modelu odhadu kardinality systému SQL Server 2012 (11.x) a starších verzí. Tento název nápovědy je ekvivalentní nastavení LEGACY_CARDINALITY_ESTIMATION = ONkonfigurace s příznakem trasování 9481 nebo databáze s vymezeným oborem .
'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n' 1 Vynutí chování optimalizátoru dotazů na úrovni dotazu. K tomuto chování dochází, jako kdyby byl dotaz zkompilován s úrovní kompatibility databáze n, kde n je podporovaná úroveň kompatibility databáze. Seznam aktuálně podporovaných hodnot pro n najdete v tématu sys.dm_exec_valid_use_hints.

Platí pro: SQL Server 2017 (14.x) CU 10 a novější verze a Azure SQL Database
'QUERY_PLAN_PROFILE' 2 Umožňuje zjednodušené profilování pro dotaz. Když se dotaz obsahující tento nový tip dokončí, aktivuje se nová rozšířená událost query_plan_profile. Tato rozšířená událost zveřejňuje statistiky provádění a skutečný plán provádění XML podobný query_post_execution_showplan rozšířené události, ale pouze pro dotazy, které obsahují novou nápovědu.

Platí pro: SQL Server 2016 (13.x) SP 2 CU 3, SQL Server 2017 (14.x) CU 11 a novější verze

1 Tip QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n nepřepíše výchozí nebo starší nastavení odhadu kardinality, pokud ho vynutíte prostřednictvím konfigurace s vymezeným oborem databáze, příznaku trasování nebo jiného tipu dotazu, například QUERYTRACEON. Tento tip má vliv pouze na chování optimalizátoru dotazů. Nemá vliv na další funkce SQL Serveru, které můžou záviset na úrovni kompatibility databáze, jako je dostupnost určitých databázových funkcí. Další informace najdete v tématu Volba vývojáře: Nápověda k modelu provádění dotazů.

2 Pokud povolíte shromažďování query_post_execution_showplan rozšířené události, přidá se standardní infrastruktura profilace do každého dotazu, který běží na serveru, a proto může ovlivnit celkový výkon serveru. Pokud povolíte shromažďování rozšířených query_thread_profile událostí tak, aby místo toho používala odlehčenou infrastrukturu profilace, bude to mít za následek mnohem menší režii na výkon, ale stále ovlivňuje celkový výkon serveru. Pokud povolíte rozšířenou query_plan_profile událost, umožní to pouze odlehčenou infrastrukturu profilace pro dotaz, který se spustil s query_plan_profile touto událostí, a proto nemá vliv na jiné úlohy na serveru. Tento tip použijte k profilování konkrétního dotazu, aniž by to ovlivnilo jiné části úlohy serveru. Další informace o zjednodušené profilaci naleznete v tématu Infrastruktura profilace dotazů.

Seznam všech podporovaných USE HINT názvů se dá dotazovat pomocí zobrazení dynamické správy sys.dm_exec_valid_use_hints.

Důležité

Některé USE HINT rady můžou kolidovat s příznaky trasování povolené na globální úrovni nebo na úrovni relace nebo s nastavením konfigurace v oboru databáze. V tomto případě má vždy přednost nápověda na úrovni dotazu (USE HINT). Pokud dojde USE HINT ke konfliktu s jiným tipem dotazu nebo příznakem trasování povoleném na úrovni dotazu (například podle QUERYTRACEON), SQL Server při pokusu o spuštění dotazu vygeneruje chybu.

USE PLAN N'xml_plan'

Vynutí Optimalizátor dotazů použít existující plán dotazu pro dotaz určený xml_plan. USE PLANnelze zadat pomocí INSERTpříkazu , , UPDATEMERGEnebo DELETE příkazů.

Výsledný plán provádění vynucený touto funkcí je stejný nebo podobný plánu, který je vynucený. Vzhledem k tomu, že výsledný plán nemusí být identický s plánem určeným USE PLAN, může se výkon plánů lišit. Ve výjimečných případech může být rozdíl mezi výkonem významný a negativní; v takovém případě musí správce odebrat vynucený plán.

TABLE HINT ( exposed_object_name [ , <table_hint> [ , ] ... n ] )

Použije zadanou tabulku nápovědu pro tabulku nebo zobrazení, které odpovídá exposed_object_name. Jako nápovědu k dotazu doporučujeme použít nápovědu tabulky pouze v kontextu průvodce plánem .

exposed_object_name může být jedním z následujících odkazů:

  • Pokud je alias použit pro tabulku nebo zobrazení v klauzuli FROM dotazu, exposed_object_name je alias.

  • Pokud se alias nepoužívá, exposed_object_name je přesná shoda tabulky nebo zobrazení odkazovaného v klauzuli FROM . Pokud je například na tabulku nebo zobrazení odkazováno pomocí názvu dvou částí, exposed_object_name je stejný dvoudílný název.

Když zadáte exposed_object_name bez zadání nápovědy k tabulce, budou všechny indexy zadané v dotazu jako součást nápovědy tabulky objektu ignorovány. Optimalizátor dotazů pak určuje využití indexu. Tuto techniku můžete použít k odstranění efektu nápovědy INDEX tabulky, když nemůžete upravit původní dotaz. Viz příklad J.

<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 | SERIALIZOVATELNÉ | SNÍMEK | SPATIAL_WINDOW_MAX_CELLS = integer_value | TABLOCK | TABLOCKX | UPDLOCK | XLOCK

Nápověda tabulky, která se má použít pro tabulku nebo zobrazení, která odpovídá exposed_object_name jako nápovědu k dotazu. Popis těchto tipů najdete v nápovědě k tabulce.

Nápovědy tabulek jiné než INDEX, FORCESCANa FORCESEEK jsou zakázány jako nápovědy dotazu, pokud dotaz již obsahuje WITH klauzuli určující nápovědu tabulky. Další informace najdete v části Poznámky.

Upozornění

Určení FORCESEEK parametrů omezuje počet plánů, které může optimalizátor dotazů zvážit více než při zadávání FORCESEEK bez parametrů. To může způsobit chybu "Plán nelze vygenerovat" v dalších případech.

FOR TIMESTAMP AS OF 'point_in_time'

Platí pro: Microsoft Fabric Data Warehouse

TIMESTAMP Pomocí syntaxe v OPTION klauzuli můžete dotazovat data, jak existovaly v minulosti, součást funkce časového cestování ve službě Synapse Data Warehouse v Microsoft Fabric.

Zadejte point_in_time ve formátu yyyy-MM-ddTHH:mm:ss[.fff] pro vrácení dat, jak se v té době zobrazují. Časové pásmo je vždy ve standardu UTC. CONVERT Použijte syntaxi potřebného formátu data a času se stylem 126.

Nápovědu TIMESTAMP AS OFOPTION lze zadat pouze jednou pomocí klauzule. Další informace a omezení najdete v tématu Dotazování dat v minulosti.

FORCE [ SINGLE NODE | DISTRIBUOVANÝ ] PLÁN

Platí pro: Microsoft Fabric Data Warehouse

Umožňuje uživateli zvolit, jestli má být vynucený plán jednoho uzlu nebo distribuovaný plán pro provádění dotazu.

Poznámky

V příkazu nelze zadat INSERT rady dotazů, s výjimkou případů, kdy SELECT se uvnitř příkazu používá klauzule.

Nápovědy dotazů je možné zadat pouze v dotazu nejvyšší úrovně, ne v poddotazech. Pokud jako nápovědu dotazu zadáte nápovědu tabulky, můžete ji zadat v dotazu nejvyšší úrovně nebo v poddotazu. Hodnota zadaná pro exposed_object_name v TABLE HINT klauzuli se však musí shodovat přesně s vystaveným názvem v dotazu nebo poddotazu.

Zadání nápovědy k tabulce jako nápovědy k dotazům

Jako nápovědu dotazu doporučujeme použít INDEXnápovědu k dotazu , FORCESCANnebo FORCESEEK tabulku pouze v kontextu průvodce plánem. Příručky plánu jsou užitečné, když nemůžete změnit původní dotaz, například proto, že se jedná o aplikaci třetí strany. Do dotazu se před kompilací a optimalizací přidá do dotazu tip dotazu zadaný v průvodci plánem. U ad hoc dotazů použijte TABLE HINT klauzuli pouze v případě příkazů průvodce testovacím plánem. U všech ostatních ad hoc dotazů doporučujeme tyto rady zadat pouze jako nápovědu tabulky.

Pokud je zadána jako nápověda dotazu, INDEXFORCESCANjsou nápovědy k tabulce a FORCESEEK , platné pro následující objekty:

  • Tabulky
  • Pohledy
  • Indexovaná zobrazení
  • Běžné výrazy tabulky (nápovědu je nutné zadat v SELECT příkazu, jehož sada výsledků naplní společný výraz tabulky).
  • Dynamické pohledy správy (DMV)
  • Pojmenované poddotazy

Jako nápovědu k dotazu, který neobsahuje žádné existující rady tabulky, můžete zadat INDEXFORCESCAN, a FORCESEEK nápovědy k tabulce. Můžete je také použít k nahrazení existujícího INDEX, FORCESCANnebo FORCESEEK nápovědy v dotazu.

Nápovědy tabulek jiné než INDEX, FORCESCANa FORCESEEK jsou zakázány jako nápovědy dotazu, pokud dotaz již obsahuje WITH klauzuli určující nápovědu tabulky. V tomto případě musí být jako nápověda dotazu zadána také odpovídající nápověda. Zadejte odpovídající nápovědu jako nápovědu dotazu pomocí TABLE HINT klauzule OPTION . Tato specifikace zachovává sémantiku dotazu. Pokud například dotaz obsahuje nápovědu NOLOCKtabulky, OPTION musí klauzule v parametru @hints průvodce plánem obsahovat také nápovědu NOLOCK . Viz příklad K.

Zadání tipů pro úložiště dotazů

Pomocí funkce nápovědy k úložišti dotazů můžete vynutit rady pro dotazy identifikované prostřednictvím úložiště dotazů, aniž byste museli provádět změny kódu. Pomocí sys.sp_query_store_set_hints uložené procedury použijte nápovědu k dotazu. Viz příklad N.

Podpora nápovědy k dotazům v datovém skladu fabric

Microsoft Fabric Data Warehouse podporuje podmnožinu tipů pro dotazy:

  • 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

Tyto rady dotazů jsou výhradní pro Datový sklad Microsoft Fabric:

  • FORCE SINGLE NODE PLAN, FORCE DISTRIBUTED PLAN

Příklady

A. Použití funkce MERGE JOIN

Následující příklad určuje, že MERGE JOIN spustí JOIN operaci v dotazu. Příklad používá AdventureWorks2022 databázi.

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. Použití FUNKCE OPTIMIZE FOR

Následující příklad dává optimalizátoru dotazů pokyn, aby při optimalizaci dotazu použil průměrnou 'Seattle'@city_name selektivitu predikátu pro všechny hodnoty @postal_code sloupců. Příklad používá AdventureWorks2022 databázi.

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. Použití FUNKCE MAXRECURSION

MAXRECURSION lze použít k tomu, aby se zabránilo špatně vytvořenému rekurzivnímu běžnému výrazu tabulky v zadávání do nekonečné smyčky. Následující příklad záměrně vytvoří nekonečnou smyčku a používá nápovědu MAXRECURSION k omezení počtu úrovní rekurze na dvě. Příklad používá AdventureWorks2022 databázi.

--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 opravě MAXRECURSION chyby kódování se už nevyžaduje.

D. Použití FUNKCE MERGE UNION

Následující příklad používá nápovědu MERGE UNION k dotazu. Příklad používá AdventureWorks2022 databázi.

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

E. Použití HASH GROUP a FAST

Následující příklad používá nápovědu a FAST nápovědu HASH GROUP k dotazu. Příklad používá AdventureWorks2022 databázi.

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. Použití MAXDOP

Následující příklad používá nápovědu MAXDOP k dotazu. Příklad používá AdventureWorks2022 databázi.

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. Použití indexu

Následující příklady používají nápovědu INDEX . První příklad určuje jeden index. Druhý příklad určuje více indexů pro jeden odkaz na tabulku. V obou příkladech, protože použijete nápovědu INDEX pro tabulku, která používá alias, TABLE HINT musí klauzule také zadat stejný alias jako název vystaveného objektu. Příklad používá AdventureWorks2022 databázi.

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. Použití SILEEK

Následující příklad používá nápovědu k FORCESEEK tabulce. Klauzule TABLE HINT musí také zadat stejný dvoudílný název jako název vystaveného objektu. Zadejte název, když použijete nápovědu INDEX pro tabulku, která používá název dvou částí. Příklad používá AdventureWorks2022 databázi.

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

Já. Použití nápovědy pro více tabulek

Následující příklad použije nápovědu INDEX pro jednu tabulku a nápovědu na jinou FORCESEEK . Příklad používá AdventureWorks2022 databázi.

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. Přepsání existující nápovědy k tabulce pomocí funkce TABLE HINT

Následující příklad ukazuje, jak použít nápovědu TABLE HINT . Nápovědu můžete použít bez zadání nápovědy k přepsání INDEX chování nápovědy tabulky, které zadáte v FROM klauzuli dotazu. Příklad používá AdventureWorks2022 databázi.

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. Určení sémantiky ovlivňující rady tabulky

Následující příklad obsahuje v dotazu dvě rady tabulky: NOLOCK, což je sémantický vliv, a INDEX, který není sémantický-ovlivňující. Chcete-li zachovat sémantiku dotazu, NOLOCK je tip zadán v OPTIONS klauzuli průvodce plánem. Spolu s nápovědou NOLOCK určete INDEX a FORCESEEK rady a nahraďte nápovědu, která není sémantický vliv INDEX na nápovědu v dotazu během kompilace a optimalizace příkazu. Příklad používá AdventureWorks2022 databázi.

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

Následující příklad ukazuje alternativní metodu zachování sémantiky dotazu a povolení optimalizátoru zvolit jiný index než index zadaný v nápovědě tabulky. Umožňuje optimalizátoru zvolit zadáním nápovědy NOLOCKOPTIONS v klauzuli. Tuto nápovědu zadáte, protože je to sémantické ovlivnění. Potom zadejte TABLE HINT klíčové slovo pouze s odkazem na tabulku a bez INDEX nápovědy. Příklad používá AdventureWorks2022 databázi.

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. Použití NÁPOVĚDY K POUŽITÍ

Následující příklad používá nápovědu a USE HINT nápovědu RECOMPILE k dotazu. Příklad používá AdventureWorks2022 databázi.

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. Použití FUNKCE QUERYTRACEON HINT

Následující příklad používá nápovědu QUERYTRACEON k dotazu. Příklad používá AdventureWorks2022 databázi. Můžete povolit všechny opravy hotfix ovlivňující plán řízené příznakem trasování 4199 pro konkrétní dotaz pomocí následujícího dotazu:

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

Můžete také použít více příznaků trasování jako v následujícím dotazu:

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

N. Použití nápovědy k úložišti dotazů

Funkce nápovědy k úložišti dotazů poskytuje snadno použitelnou metodu pro tvarování plánů dotazů beze změny kódu aplikace.

Nejprve identifikujte dotaz, který už byl spuštěn v zobrazeních katalogu úložiště dotazů, například:

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

Následující příklad použije nápovědu k vynucení starší verze estimátoru kardinality na query_id 39 identifikovaný v úložišti dotazů:

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

Následující příklad použije nápovědu k vynucení maximální velikosti přidělení paměti v PERCENT nakonfigurované paměti limitu na query_id 39 identifikovaných v úložišti dotazů:

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

Následující příklad používá více tipů dotazu na query_id 39, včetně RECOMPILE, MAXDOP 1a sql Server 2012 (11.x) chování optimalizátoru dotazů:

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

Následující příklad blokuje dotaz s query_id 39 z budoucího spuštění použitím nápovědy ABORT_QUERY_EXECUTION . Nápověda je ve verzi Preview.

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

O. Dotazování dat k určitému bodu v čase

Platí pro: Warehouse v Microsoft Fabric

TIMESTAMP Pomocí syntaxe v OPTION klauzuli se můžete dotazovat na data, která existovala v minulosti, ve službě Synapse Data Warehouse v Microsoft Fabric. Následující ukázkový dotaz vrátí data, která se zobrazila 13. března 2024 v 7:39:35.28 UTC. Časové pásmo je vždy ve standardu 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