Delen via


Queryhints (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL Analytics-eindpunt in Microsoft FabricWarehouse in Microsoft FabricSQL-database in Microsoft Fabric

Queryhints geven aan dat de aangegeven hints worden gebruikt in het bereik van een query. Ze zijn van invloed op alle operators in de instructie. Als UNION betrokken is bij de hoofdquery, kan alleen de laatste query met een UNION-bewerking de OPTION-component hebben. Queryhints worden opgegeven als onderdeel van de OPTION-component. Fout 8622 treedt op als een of meer queryhints ertoe leiden dat de Query Optimizer geen geldig plan genereert.

Waarschuwing

Omdat sql Server Query Optimizer doorgaans het beste uitvoeringsplan voor een query selecteert, raden we u aan alleen hints te gebruiken als laatste redmiddel voor ervaren ontwikkelaars en databasebeheerders.

van toepassing op:

Transact-SQL syntaxis-conventies

Syntaxis

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

<use_hint_name> ::=
{ 'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'
  | 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES'
  | 'ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES'
  | 'ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES'
  | 'DISABLE_BATCH_MODE_ADAPTIVE_JOINS'
  | 'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK'
  | 'DISABLE_DEFERRED_COMPILATION_TV'
  | 'DISABLE_INTERLEAVED_EXECUTION_TVF'
  | 'DISABLE_OPTIMIZED_NESTED_LOOP'
  | 'DISABLE_OPTIMIZER_ROWGOAL'
  | 'DISABLE_PARAMETER_SNIFFING'
  | 'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK'
  | 'DISABLE_TSQL_SCALAR_UDF_INLINING'
  | 'DISALLOW_BATCH_MODE'
  | 'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS'
  | 'ENABLE_QUERY_OPTIMIZER_HOTFIXES'
  | 'FORCE_DEFAULT_CARDINALITY_ESTIMATION'
  | 'FORCE_LEGACY_CARDINALITY_ESTIMATION'
  | 'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n'
  | 'QUERY_PLAN_PROFILE'
}

Argumenten

{ HASH | ORDER } GROUP

Hiermee geeft u op dat aggregaties die door de GROUP BY of DISTINCT component van de query worden beschreven, hashing of volgorde moeten gebruiken.

  • Over het algemeen kan een algoritme op basis van hash de prestaties verbeteren van query's die betrekking hebben op grote of complexe groeperingssets.
  • Over het algemeen kan een algoritme op basis van sortering de prestaties van query's verbeteren waarbij kleine of eenvoudige groeperingssets worden gebruikt.

{ MERGE | HASH | CONCAT } UNION

Hiermee geeft u op dat alle UNION bewerkingen worden uitgevoerd door het samenvoegen, hashen of samenvoegen van UNION sets. Als er meer dan één UNION hint is opgegeven, selecteert de Query Optimizer de minst dure strategie uit die hints die zijn opgegeven.

  • Over het algemeen kan een bewerking op basis van een samenvoegingsalgoritmen de prestaties verbeteren van query's die betrekking hebben op gesorteerde invoer.
  • Over het algemeen kan een hash-algoritme de prestaties van query's verbeteren waarbij niet-gesorteerde of grote invoer wordt gebruikt.
  • Over het algemeen kan een algoritme op basis van samenvoeging de prestaties van query's verbeteren waarbij afzonderlijke of kleine invoer wordt gebruikt.

{ LOOP | SAMENVOEGEN | HASH } JOIN

Hiermee geeft u op dat alle joinbewerkingen worden uitgevoerd door LOOP JOIN, MERGE JOINof HASH JOIN in de hele query. Als u meer dan één join-hint opgeeft, selecteert de optimizer de goedkoopste joinstrategie van de toegestane joins.

Als u een joinhint opgeeft in de FROM-component van dezelfde query voor een specifiek tabelpaar, heeft deze join-hint voorrang bij het samenvoegen van de twee tabellen. De queryhints moeten echter nog steeds worden gehonoreerd. De join-hint voor het paar tabellen beperkt mogelijk alleen de selectie van toegestane joinmethoden in de queryhint. Zie Hints voor deelnamevoor meer informatie.

DISABLE_OPTIMIZED_PLAN_FORCING

van toepassing op: SQL Server (vanaf SQL Server 2022 (16.x))

Hiermee schakelt u geoptimaliseerd plan voor het afdwingen van voor een query.

Geoptimaliseerd plan afdwingen vermindert compilatieoverhead voor herhalende geforceerde query's. Zodra het queryuitvoeringsplan is gegenereerd, worden specifieke compilatiestappen opgeslagen voor hergebruik als een optimalisatiescript voor opnieuw afspelen. Een script voor het opnieuw afspelen van optimalisatie wordt opgeslagen als onderdeel van de gecomprimeerde showplan XML in Query Store, in een verborgen OptimizationReplay kenmerk.

WEERGAVEN UITVOUWEN

Hiermee geeft u de geïndexeerde weergaven worden uitgevouwen. Hiermee geeft u ook de Query Optimizer geen geïndexeerde weergave als vervanging voor een queryonderdeel. Een weergave wordt uitgevouwen wanneer de weergavedefinitie de weergavenaam in de querytekst vervangt.

Met deze queryhint wordt het gebruik van geïndexeerde weergaven en indexen voor geïndexeerde weergaven in het queryplan vrijwel niet toegestaan.

Notitie

De geïndexeerde weergave blijft ingekort als er een directe verwijzing naar de weergave in het SELECT gedeelte van de query staat. De weergave blijft ook verkort als u WITH (NOEXPAND) of WITH (NOEXPAND, INDEX( <index_value> [ , *...n* ] ) )opgeeft. Zie NoEXPAND gebruikenvoor meer informatie over de queryhint NOEXPAND.

De hint is alleen van invloed op de weergaven in het SELECT gedeelte van de instructies, inclusief die weergaven in INSERT, UPDATE, MERGEen DELETE instructies.

FAST integer_value

Hiermee geeft u op dat de query is geoptimaliseerd voor het snel ophalen van het eerste integer_value aantal rijen. Dit resultaat is een niet-negatief geheel getal. Nadat het eerste integer_value aantal rijen is geretourneerd, wordt de uitvoering van de query voortgezet en wordt de volledige resultatenset geproduceerd.

FORCE ORDER

Hiermee geeft u op dat de joinvolgorde die wordt aangegeven door de querysyntaxis behouden blijft tijdens queryoptimalisatie. Het gebruik van FORCE ORDER heeft geen invloed op mogelijk omkeringsgedrag van de functie queryoptimalisatie.

FORCE ORDER behoudt de joinvolgorde die is opgegeven in de query, waardoor de prestaties of consistentie van query's die complexe joinvoorwaarden of hints omvatten, mogelijk worden verbeterd.

Notitie

In een MERGE-instructie wordt de brontabel geopend voordat de doeltabel als de standaardvolgorde voor joins wordt gebruikt, tenzij de WHEN SOURCE NOT MATCHED component is opgegeven. Als u FORCE ORDER opgeeft, blijft dit standaardgedrag behouden.

{ FORCE | DISABLE } EXTERNALPUSHDOWN

Forceer of schakel de pushdown uit van de berekening van in aanmerking komende expressies in Hadoop. Alleen van toepassing op query's met PolyBase. Pusht niet naar Azure Storage.

{ FORCE | DISABLE } SCALEOUTEXECUTION

Uitschalen van PolyBase-query's die gebruikmaken van externe tabellen in BIG Data-clusters van SQL Server 2019afdwingen of uitschakelen. Deze hint wordt alleen gehonoreerd door een query met behulp van het hoofdexemplaren van een SQL Big Data-cluster. De uitschaalbewerking vindt plaats in de rekengroep van het big data-cluster.

PLAN BEHOUDEN

Wijzigt de drempelwaarden voor hercompilatie voor tijdelijke tabellen en maakt deze identiek aan de drempelwaarden voor permanente tabellen. De geschatte drempelwaarde voor opnieuw compileren start een automatische hercompilatie voor de query wanneer het geschatte aantal geïndexeerde kolomwijzigingen wordt aangebracht in een tabel door een van de volgende instructies uit te voeren:

  • UPDATE
  • DELETE
  • MERGE
  • INSERT

Als u KEEP PLAN opgeeft, zorgt u ervoor dat een query niet zo vaak opnieuw wordt gecompileerd wanneer er meerdere updates voor een tabel zijn.

KEEPFIXED PLAN

Hiermee dwingt u af dat de Query Optimizer een query niet opnieuw compileert vanwege wijzigingen in statistieken. Als u KEEPFIXED PLAN opgeeft, zorgt u ervoor dat een query alleen opnieuw wordt gecompileert als het schema van de onderliggende tabellen verandert of als sp_recompile wordt uitgevoerd op deze tabellen.

IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX

van toepassing op: SQL Server (te beginnen met SQL Server 2012 (11.x)).

Hiermee voorkomt u dat de query gebruikmaakt van een niet-geclusterde columnstore-index die is geoptimaliseerd voor geheugen. Als de query de queryhint bevat om het gebruik van de columnstore-index te voorkomen en een indexhint voor het gebruik van een columnstore-index, zijn de hints conflicterend en retourneert de query een fout.

MAX_GRANT_PERCENT = <numeric_value>

van toepassing op: SQL Server (te beginnen met SQL Server 2012 (11.x) Service Pack 3, SQL Server 2014 (12.x) Service Pack 2 en Azure SQL Database.

De maximale geheugentoekenningsgrootte in PERCENT van geconfigureerde geheugenlimiet. De query overschrijdt deze limiet gegarandeerd niet als de query wordt uitgevoerd in een door de gebruiker gedefinieerde resourcegroep. Als de query in dit geval niet beschikt over het minimaal vereiste geheugen, treedt er een fout op. Als een query wordt uitgevoerd in de systeemgroep (standaard), krijgt deze minimaal het geheugen dat nodig is om uit te voeren. De werkelijke limiet kan lager zijn als de instelling Resource Governor lager is dan de waarde die door deze hint is opgegeven. Geldige waarden liggen tussen 0,0 en 100,0.

De hint voor geheugentoekenning is niet beschikbaar voor het maken van indexen of het opnieuw samenstellen van indexen.

MIN_GRANT_PERCENT = <numeric_value>

van toepassing op: SQL Server (te beginnen met SQL Server 2012 (11.x) Service Pack 3, SQL Server 2014 (12.x) Service Pack 2 en Azure SQL Database.

De minimale geheugentoekenningsgrootte in PERCENT van geconfigureerde geheugenlimiet. De query krijgt gegarandeerd MAX(required memory, min grant) omdat ten minste vereist geheugen nodig is om een query te starten. Geldige waarden liggen tussen 0,0 en 100,0.

Met de min_grant_percent optie voor geheugentoekenningen wordt de optie sp_configure (minimumgeheugen per query (KB)) overschreven, ongeacht de grootte. De hint voor geheugentoekenning is niet beschikbaar voor het maken van indexen of het opnieuw samenstellen van indexen.

MAXDOP-<integer_value>

van toepassing op: SQL Server (te beginnen met SQL Server 2008 (10.0.x)) en Azure SQL Database.

Overschrijft de maximale mate van parallelle uitvoering configuratieoptie van sp_configure. Overschrijft ook de Resource Governor voor de query die deze optie opgeeft. De MAXDOP queryhint kan de waarde overschrijden die is geconfigureerd met sp_configure. Als MAXDOP de waarde overschrijdt die is geconfigureerd met Resource Governor, gebruikt de Database Engine de MAXDOP-waarde van Resource Governor, zoals beschreven in ALTER WORKLOAD GROUP. Alle semantische regels die worden gebruikt met de maximale mate van parallelle uitvoering configuratieoptie zijn van toepassing wanneer u de MAXDOP queryhint gebruikt. Zie De maximale mate van parallelle configuratie van server configurerenvoor meer informatie.

Waarschuwing

Als MAXDOP is ingesteld op nul, kiest de server de maximale mate van parallelle uitvoering.

MAXRECURSION-<integer_value>

Hiermee geeft u het maximum aantal recursies op dat is toegestaan voor deze query. getal een positief geheel getal tussen 0 en 32.767 is. Wanneer 0 is opgegeven, wordt er geen limiet toegepast. Als deze optie niet is opgegeven, is de standaardlimiet voor de server 100.

Wanneer het opgegeven of standaardnummer voor MAXRECURSION limiet wordt bereikt tijdens het uitvoeren van de query, eindigt de query en wordt een fout geretourneerd.

Vanwege deze fout worden alle effecten van de instructie teruggedraaid. Als de instructie een SELECT instructie is, kunnen gedeeltelijke resultaten of geen resultaten worden geretourneerd. Gedeeltelijke resultaten die worden geretourneerd, bevatten mogelijk niet alle rijen op recursieniveaus buiten het opgegeven maximumrecursieniveau.

Zie WITH common_table_expressionvoor meer informatie.

NO_PERFORMANCE_SPOOL

van toepassing op: SQL Server (te beginnen met SQL Server 2016 (13.x)) en Azure SQL Database.

Hiermee voorkomt u dat een spooloperator wordt toegevoegd aan queryplannen (met uitzondering van de plannen wanneer spool is vereist om geldige update-semantiek te garanderen). De spooloperator kan in sommige scenario's de prestaties verminderen. De spool maakt bijvoorbeeld gebruik van tempdben tempdb conflicten kunnen optreden als er veel gelijktijdige query's worden uitgevoerd met de spoolbewerkingen.

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

Geeft de queryoptimalisatie de opdracht om een bepaalde waarde voor een lokale variabele te gebruiken wanneer de query wordt gecompileerd en geoptimaliseerd. De waarde wordt alleen gebruikt tijdens het optimaliseren van query's en niet tijdens het uitvoeren van query's.

  • @variable_name

    De naam van een lokale variabele die wordt gebruikt in een query, waaraan een waarde kan worden toegewezen voor gebruik met de OPTIMIZE FOR queryhint.

  • UNKNOWN

    Hiermee geeft u op dat de Query Optimizer statistische gegevens gebruikt in plaats van de initiële waarde om de waarde voor een lokale variabele tijdens queryoptimalisatie te bepalen.

  • literal_constant

    Een letterlijke constante waarde die moet worden toegewezen @variable_name voor gebruik met de OPTIMIZE FOR queryhint. literal_constant wordt alleen gebruikt tijdens het optimaliseren van query's en niet als de waarde van @variable_name tijdens het uitvoeren van query's. literal_constant kan van elk gegevenstype van het SQL Server-systeem zijn dat kan worden uitgedrukt als een letterlijke constante. Het gegevenstype van literal_constant moet impliciet worden omgezet in het gegevenstype dat @variable_name verwijzingen in de query.

OPTIMIZE FOR kan het standaarddetectiegedrag van de optimizer tegenwerken. Gebruik ook OPTIMIZE FOR wanneer u planhandleidingen maakt. Zie Een opgeslagen procedure opnieuw compileren voor meer informatie.

OPTIMALISEREN VOOR ONBEKEND

Geeft de queryoptimalisatie de opdracht om de gemiddelde selectiviteit van het predicaat voor alle kolomwaarden te gebruiken in plaats van de runtimeparameterwaarde te gebruiken wanneer de query wordt gecompileerd en geoptimaliseerd.

Als u OPTIMIZE FOR @variable_name = <literal_constant> en OPTIMIZE FOR UNKNOWN in dezelfde queryhint gebruikt, gebruikt queryoptimalisatie de literal_constant die voor een specifieke waarde zijn opgegeven. Query Optimizer gebruikt UNKNOWN voor de rest van de variabelewaarden. De waarden worden alleen gebruikt tijdens het optimaliseren van query's en niet tijdens het uitvoeren van query's.

PARAMETERISATIE { SIMPLE | GEFORCEERD }

Hiermee geeft u de parameterisatieregels op die de SQL Server Query Optimizer toepast op de query wanneer deze wordt gecompileerd.

Belangrijk

De PARAMETERIZATION queryhint kan alleen worden opgegeven in een planhandleiding om de huidige instelling van de PARAMETERIZATION database SET optie te overschrijven. Deze kan niet rechtstreeks in een query worden opgegeven.

Zie Queryparameterisatiegedrag opgeven met behulp van planhandleidingenvoor meer informatie.

SIMPLE geeft de queryoptimalisatie opdracht om eenvoudige parameters te proberen. FORCED geeft de Query Optimizer opdracht om geforceerde parameterisatie uit te voeren. Zie Geforceerde parameterisatie in de handleiding voor queryverwerkingsarchitectuuren eenvoudige parameterisatie in de architectuurhandleiding voor queryverwerkingvoor meer informatie.

QUERYTRACEON-<integer_value>

Met deze optie kunt u een traceringsvlag die van invloed is op een plan alleen inschakelen tijdens het compileren van één query. Net als bij andere opties op queryniveau kunt u deze samen met planhulplijnen gebruiken om de tekst van een query te vinden die wordt uitgevoerd vanuit een sessie en automatisch een traceringsvlag toepassen die van invloed is op het plan wanneer deze query wordt gecompileerd. De optie QUERYTRACEON wordt alleen ondersteund voor traceringsvlagmen van Query Optimizer. Zie traceringsvlagmenvoor meer informatie.

Als u deze optie gebruikt, wordt er geen fout of waarschuwing geretourneerd als er een niet-ondersteund traceringsvlagnummer wordt gebruikt. Als de opgegeven traceringsvlag niet van invloed is op een queryuitvoeringsplan, wordt de optie op de achtergrond genegeerd.

Als u meer dan één traceringsvlag in een query wilt gebruiken, geeft u één QUERYTRACEON hint op voor elk ander traceringsvlagnummer.

HERCOMPILEREN

Hiermee wordt de SQL Server Database Engine geïnstrueerd om een nieuw, tijdelijk plan voor de query te genereren en dat plan onmiddellijk te verwijderen nadat de query is uitgevoerd. Het gegenereerde queryplan vervangt geen plan dat is opgeslagen in de cache wanneer dezelfde query wordt uitgevoerd zonder de RECOMPILE hint. Zonder RECOMPILEop te geven, slaat de database-engine queryplannen in de cache op en gebruikt deze opnieuw. Wanneer queryplannen worden gecompileerd, gebruikt de RECOMPILE queryhint de huidige waarden van lokale variabelen in de query. Als de query zich in een opgeslagen procedure bevindt, worden de huidige waarden doorgegeven aan parameters.

RECOMPILE is een handig alternatief voor het maken van een opgeslagen procedure. RECOMPILE de WITH RECOMPILE-component gebruikt wanneer alleen een subset van query's in de opgeslagen procedure, in plaats van de hele opgeslagen procedure, opnieuw moet worden gecompileerd. Zie Een opgeslagen procedure opnieuw compileren voor meer informatie. RECOMPILE is ook handig wanneer u planhandleidingen maakt.

ROBUUST PLAN

Dwingt de Query Optimizer om een plan te proberen dat werkt voor de maximale mogelijke rijgrootte, mogelijk ten koste van de prestaties. Wanneer de query wordt verwerkt, moeten tussenliggende tabellen en operators mogelijk rijen opslaan en verwerken die breder zijn dan een van de invoerrijen wanneer de query wordt verwerkt. De rijen kunnen zo breed zijn dat de specifieke operator de rij soms niet kan verwerken. Als rijen zo breed zijn, produceert de database-engine een fout tijdens het uitvoeren van de query. Door ROBUST PLANte gebruiken, geeft u de queryoptimalisatie de opdracht om geen queryplannen te overwegen die dit probleem kunnen ondervinden.

Als een dergelijk plan niet mogelijk is, retourneert de Query Optimizer een fout in plaats van foutdetectie uit te stellen voor het uitvoeren van query's. Rijen kunnen kolommen met een variabele lengte bevatten; Met de database-engine kunnen rijen worden gedefinieerd die een maximale mogelijke grootte hebben dan de mogelijkheid van de database-engine om ze te verwerken. Over het algemeen slaat een toepassing, ondanks de maximale mogelijke grootte, rijen op met werkelijke grootten binnen de limieten die de database-engine kan verwerken. Als de database-engine een rij tegenkomt die te lang is, wordt er een uitvoeringsfout geretourneerd.

HINT GEBRUIKEN ( 'hint_name' )

van toepassing op: SQL Server (te beginnen met SQL Server 2016 (13.x) SP1) en Azure SQL Database.

Biedt een of meer extra hints voor de queryprocessor. De extra hints worden opgegeven met een hintnaam tussen enkele aanhalingstekens.

Hint

Hintnamen zijn niet hoofdlettergevoelig.

De volgende hintnamen worden ondersteund:

Tip Beschrijving
'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS' Hiermee wordt een queryplan gegenereerd met behulp van de aanname Simple Containment in plaats van de standaardaanname basisinsluiting voor joins, onder de queryoptimalisatie schatting van kardinaliteit model van SQL Server 2014 (12.x) en latere versies. Deze hintnaam is gelijk aan traceringsvlag 9476.
'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES' Genereert een plan met minimale selectiviteit bij het schatten en predicaten voor filters om rekening te houden met volledige correlatie. Deze hintnaam komt overeen met traceringsvlag 4137 wanneer deze wordt gebruikt met het model voor kardinaliteitschatting van SQL Server 2012 (11.x) en eerdere versies, en heeft een vergelijkbaar effect wanneer traceringsvlag 9471 wordt gebruikt met het model voor kardinaliteitschatting van SQL Server 2014 (12.x) en latere versies.
'ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES' Genereert een plan met behulp van maximale selectiviteit bij het schatten van EN predicaten voor filters om volledige onafhankelijkheid te bereken. Deze hintnaam is het standaardgedrag van het kardinaliteitschattingsmodel van SQL Server 2012 (11.x) en eerdere versies, en komt overeen met Trace Flag 9472 bij gebruik met het kardinaliteitschattingsmodel van SQL Server 2014 (12.x) en latere versies.

van toepassing op: Azure SQL Database
'ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES' Hiermee wordt een plan gegenereerd dat de meeste tot de minste selectiviteit gebruikt bij het schatten van EN predicaten voor filters om rekening te houden met gedeeltelijke correlatie. Deze hintnaam is het standaardgedrag van het kardinaliteitschattingsmodel van SQL Server 2014 (12.x) en latere versies.

van toepassing op: Azure SQL Database
'DISABLE_BATCH_MODE_ADAPTIVE_JOINS' Schakelt adaptieve joins in de batchmodus uit. Zie Adaptieve joins in de Batch-modusvoor meer informatie.

van toepassing op: SQL Server 2017 (14.x) en latere versies en Azure SQL Database
'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK' Schakelt het geheugen van de batchmodus uit om feedback te geven. Zie Batch-modus geheugen feedback gevenvoor meer informatie.

van toepassing op: SQL Server 2017 (14.x) en latere versies en Azure SQL Database
'DISABLE_DEFERRED_COMPILATION_TV' Schakelt uitgestelde compilatie van tabelvariabelen uit. Zie Tabelvariabelevoor meer informatie.

van toepassing op: SQL Server 2019 (15.x) en latere versies en Azure SQL Database
'DISABLE_INTERLEAVED_EXECUTION_TVF' Schakelt interleaved uitvoering uit voor tabelwaardefuncties met meerdere instructies. Zie Interleaved-uitvoering voor tabelfuncties met meerdere instructiesvoor meer informatie.

van toepassing op: SQL Server 2017 (14.x) en latere versies en Azure SQL Database
'DISABLE_OPTIMIZED_NESTED_LOOP' Geeft de queryprocessor de opdracht om geen sorteerbewerking (batchsorteerd) te gebruiken voor geoptimaliseerde geneste luskoppelingen bij het genereren van een queryplan. Deze hintnaam is gelijk aan traceringsvlag 2340. Deze hint is ook van toepassing op expliciete sorteringen en batchsorteerders.
'DISABLE_OPTIMIZER_ROWGOAL' Zorgt ervoor dat SQL Server een plan genereert dat geen wijzigingen in rijdoel gebruikt met query's die deze trefwoorden bevatten:

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

Deze hintnaam is gelijk aan traceringsvlag 4138.
'DISABLE_PARAMETER_SNIFFING' Geeft Query Optimizer de opdracht om de gemiddelde gegevensdistributie te gebruiken tijdens het compileren van een query met een of meer parameters. Deze instructie maakt het queryplan onafhankelijk van de parameterwaarde die voor het eerst werd gebruikt toen de query werd gecompileerd. Deze hintnaam is gelijk aan traceringsvlag 4136 of configuratie van databasebereik instelling PARAMETER_SNIFFING = OFF.
'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK' Hiermee schakelt u het geheugen van de rijmodus terugkoppeling uit. Zie rijmodus geheugen feedback gevenvoor meer informatie.

van toepassing op: SQL Server 2019 (15.x) en latere versies en Azure SQL Database
'DISABLE_TSQL_SCALAR_UDF_INLINING' Schakelt scalaire UDF-inlining uit. Zie Scalar UDF Inliningvoor meer informatie.

van toepassing op: SQL Server 2019 (15.x) en latere versies en Azure SQL Database
'DISALLOW_BATCH_MODE' Hiermee schakelt u de uitvoering van de batchmodus uit. Zie Uitvoeringsmodivoor meer informatie.

van toepassing op: SQL Server 2019 (15.x) en latere versies en Azure SQL Database
'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS' Maakt automatisch gegenereerde snelle statistieken (histogramwijziging) mogelijk voor elke voorloopindexkolom waarvoor kardinaliteitschatting nodig is. Het histogram dat wordt gebruikt om de kardinaliteit te schatten, wordt aangepast bij het compileren van query's om rekening te houden met de werkelijke maximum- of minimumwaarde van deze kolom. Deze hintnaam is gelijk aan traceringsvlag 4139.
'ENABLE_QUERY_OPTIMIZER_HOTFIXES' Hiermee worden hotfixes voor Query Optimizer ingeschakeld (wijzigingen die zijn uitgebracht in cumulatieve SQL Server-updates en servicepacks). Deze hintnaam is gelijk aan traceringsvlag 4199 of configuratie van databasebereik instelling QUERY_OPTIMIZER_HOTFIXES = ON.
'FORCE_DEFAULT_CARDINALITY_ESTIMATION' Dwingt de Query Optimizer om kardinaliteitschatting te gebruiken model dat overeenkomt met het huidige databasecompatibiliteitsniveau. Gebruik deze hint om configuratie met databasebereik te overschrijven instelling LEGACY_CARDINALITY_ESTIMATION = ON of traceringsvlag 9481.
'FORCE_LEGACY_CARDINALITY_ESTIMATION' Dwingt de Query Optimizer om kardinaliteitschatting te gebruiken model van SQL Server 2012 (11.x) en eerdere versies. Deze hintnaam is gelijk aan traceringsvlag 9481 of configuratie van databasebereik instelling LEGACY_CARDINALITY_ESTIMATION = ON.
'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n' 1 Hiermee dwingt u het gedrag van Query Optimizer af op queryniveau. Dit gedrag treedt op alsof de query is gecompileerd met databasecompatibiliteitsniveau n, waarbij n een ondersteund databasecompatibiliteitsniveau is. Zie sys.dm_exec_valid_use_hintsvoor een lijst met momenteel ondersteunde waarden voor n.

van toepassing op: SQL Server 2017 (14.x) CU 10 en latere versies en Azure SQL Database
'QUERY_PLAN_PROFILE' 2 Maakt lichtgewicht profilering mogelijk voor de query. Wanneer een query met deze nieuwe hint is voltooid, wordt een nieuwe uitgebreide gebeurtenis, query_plan_profile, geactiveerd. Met deze uitgebreide gebeurtenis worden uitvoeringsstatistieken en XML van het werkelijke uitvoeringsplan weergegeven die vergelijkbaar zijn met de uitgebreide query_post_execution_showplan gebeurtenis, maar alleen voor query's die de nieuwe hint bevatten.

Van toepassing op: SQL Server 2016 (13.x) SP 2 CU 3, SQL Server 2017 (14.x) CU 11 en latere versies

1 De QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n hint overschrijft de standaardinstelling of verouderde kardinaliteitschatting niet als u deze afdringt via configuratie met databasebereik, traceringsvlag of een andere queryhint, zoals QUERYTRACEON. Deze hint is alleen van invloed op het gedrag van de queryoptimalisatie. Dit heeft geen invloed op andere functies van SQL Server die mogelijk afhankelijk zijn van het databasecompatibiliteitsniveau, zoals de beschikbaarheid van bepaalde databasefuncties. Zie Developer's Choice: Hinting Query Execution modelvoor meer informatie.

2 Als u het verzamelen van de query_post_execution_showplan uitgebreide gebeurtenis inschakelt, wordt de standaardprofileringsinfrastructuur toegevoegd aan elke query die op de server wordt uitgevoerd en kan dit invloed hebben op de algehele serverprestaties. Als u het verzamelen van query_thread_profile uitgebreide gebeurtenis inschakelt om in plaats daarvan een lichtgewicht profileringsinfrastructuur te gebruiken, resulteert dit in veel minder prestatieoverhead, maar is dit nog steeds van invloed op de algehele serverprestaties. Als u de query_plan_profile uitgebreide gebeurtenis inschakelt, wordt hiermee alleen de lichtgewicht profileringsinfrastructuur ingeschakeld voor een query die met de query_plan_profile wordt uitgevoerd en dus geen invloed heeft op andere werkbelastingen op de server. Gebruik deze hint om een specifieke query te profilen zonder dat dit van invloed is op andere onderdelen van de serverworkload. Zie Infrastructuur voor queryprofileringvoor meer informatie over lichtgewicht profilering.

De lijst met alle ondersteunde USE HINT namen kan worden opgevraagd met behulp van de dynamische beheerweergave sys.dm_exec_valid_use_hints.

Belangrijk

Sommige USE HINT hints kunnen conflicteren met traceringsvlagmen die zijn ingeschakeld op globaal of sessieniveau, of configuratie-instellingen voor databasebereik. In dit geval heeft de hint op queryniveau (USE HINT) altijd voorrang. Als een USE HINT een conflict veroorzaakt met een andere queryhint of een traceringsvlag die is ingeschakeld op queryniveau (zoals door QUERYTRACEON), genereert SQL Server een fout bij het uitvoeren van de query.

USE PLAN N'xml_plan'

Dwingt de Query Optimizer om een bestaand queryplan te gebruiken voor een query die is opgegeven door xml_plan. USE PLAN kan niet worden opgegeven met INSERT, UPDATE, MERGEof DELETE instructies.

Het resulterende uitvoeringsplan dat door deze functie wordt gedwongen, is hetzelfde of vergelijkbaar met het plan dat wordt gedwongen. Omdat het resulterende plan mogelijk niet identiek is aan het plan dat is opgegeven door USE PLAN, kunnen de prestaties van de plannen variëren. In zeldzame gevallen kan het prestatieverschil aanzienlijk en negatief zijn; In dat geval moet de beheerder het geforceerde plan verwijderen.

TABELHINT ( exposed_object_name [ , <table_hint> [ , ] ... n ] ] )

Hiermee past u de opgegeven tabelhint toe op de tabel of weergave die overeenkomt met exposed_object_name. We raden u aan om een tabelhint alleen te gebruiken als een queryhint in de context van een planhandleiding.

exposed_object_name kan een van de volgende verwijzingen zijn:

  • Wanneer een alias wordt gebruikt voor de tabel of weergave in de FROM component van de query, is exposed_object_name de alias.

  • Wanneer een alias niet wordt gebruikt, is exposed_object_name de exacte overeenkomst van de tabel of weergave waarnaar wordt verwezen in de FROM-component. Als bijvoorbeeld naar de tabel of weergave wordt verwezen met behulp van een tweedelige naam, is exposed_object_name dezelfde tweedelige naam.

Wanneer u exposed_object_name opgeeft zonder ook een tabelhint op te geven, worden alle indexen die u in de query opgeeft als onderdeel van een tabelhint voor het object genegeerd. Query Optimizer bepaalt vervolgens het indexgebruik. U kunt deze techniek gebruiken om het effect van een INDEX tabelhint te elimineren wanneer u de oorspronkelijke query niet kunt wijzigen. Zie voorbeeld-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 | HERHAALBAAR GELEZEN | ROWLOCK | SERIALIZEERBAAR | MOMENTOPNAME | SPATIAL_WINDOW_MAX_CELLS = integer_value | TABLOCK | TABLOCKX | UPDLOCK | XLOCK

De tabelhint die moet worden toegepast op de tabel of weergave die overeenkomt met exposed_object_name als een queryhint. Zie Tabelhintsvoor een beschrijving van deze hints.

Andere tabelhints dan INDEX, FORCESCANen FORCESEEK zijn niet toegestaan als queryhints, tenzij de query al een WITH component bevat waarin de tabelhint wordt opgegeven. Zie de sectie Opmerkingenvoor meer informatie.

Waarschuwing

Als u FORCESEEK met parameters opgeeft, wordt het aantal plannen beperkt dat door de queryoptimalisatie meer kan worden overwogen dan wanneer u FORCESEEK zonder parameters opgeeft. Dit kan ertoe leiden dat er in meer gevallen een fout 'Plan kan niet worden gegenereerd'.

FOR TIMESTAMP AS OF 'point_in_time'

van toepassing op: Microsoft Fabric Data Warehouse

Gebruik de syntaxis van de TIMESTAMP in de OPTION component om gegevens op te vragen zoals deze in het verleden bestonden, onderdeel van de functie tijdreizen in Synapse Data Warehouse in Microsoft Fabric.

Geef de point_in_time op in de indeling yyyy-MM-ddTHH:mm:ss[.fff] om gegevens te retourneren zoals op dat moment werd weergegeven. De tijdzone bevindt zich altijd in UTC. Gebruik de CONVERT syntaxis voor de benodigde datum/tijd-indeling met stijl 126.

De TIMESTAMP AS OF hint kan slechts eenmaal worden opgegeven met behulp van de OPTION component. Zie voor meer informatie en beperkingen Querygegevens zoals deze in het verleden bestaan.

FORCE [ ENKEL KNOOPPUNT | GEDISTRIBUEERD ] PLAN

van toepassing op: Microsoft Fabric Data Warehouse

Hiermee kan de gebruiker kiezen of een plan met één knooppunt of een gedistribueerd plan moet worden afgedwongen voor de uitvoering van de query.

Opmerkingen

Queryhints kunnen niet worden opgegeven in een INSERT instructie, behalve wanneer een SELECT component wordt gebruikt in de instructie.

Queryhints kunnen alleen worden opgegeven in de query op het hoogste niveau, niet in subquery's. Wanneer een tabelhint wordt opgegeven als een queryhint, kan de hint worden opgegeven in de query op het hoogste niveau of in een subquery. De waarde die is opgegeven voor exposed_object_name in de TABLE HINT-component, moet echter exact overeenkomen met de weergegeven naam in de query of subquery.

Tabelhints opgeven als queryhints

We raden u aan de hint voor de INDEX, FORCESCANof FORCESEEK tabel alleen te gebruiken als een queryhint in de context van een planhandleiding. Planhandleidingen zijn handig wanneer u de oorspronkelijke query niet kunt wijzigen, bijvoorbeeld omdat het een toepassing van derden is. De queryhint die is opgegeven in de planhandleiding, wordt toegevoegd aan de query voordat deze wordt gecompileerd en geoptimaliseerd. Voor ad-hocquery's gebruikt u de TABLE HINT-component alleen wanneer u instructies voor planrichtlijnen test. Voor alle andere ad-hocquery's raden we u aan deze hints alleen op te geven als tabelhints.

Wanneer deze is opgegeven als een queryhint, zijn de INDEX, FORCESCANen FORCESEEK tabelhints geldig voor de volgende objecten:

  • Tabellen
  • Weergaven
  • Geïndexeerde weergaven
  • Algemene tabelexpressies (de hint moet worden opgegeven in de instructie SELECT waarvan de resultatenset de algemene tabelexpressie vult)
  • Dynamische beheerweergaven (DMV's)
  • Benoemde subquery's

U kunt INDEX, FORCESCANen FORCESEEK tabelhints opgeven als queryhints voor een query die geen bestaande tabelhints bevat. U kunt ze ook gebruiken om bestaande INDEX, FORCESCANof FORCESEEK hints in de query te vervangen.

Andere tabelhints dan INDEX, FORCESCANen FORCESEEK zijn niet toegestaan als queryhints, tenzij de query al een WITH component bevat waarin de tabelhint wordt opgegeven. In dit geval moet ook een overeenkomende hint worden opgegeven als een queryhint. Geef de overeenkomende hint op als een queryhint met behulp van TABLE HINT in de OPTION-component. Deze specificatie behoudt de semantiek van de query. Als de query bijvoorbeeld de tabelhint bevat NOLOCK, moet de OPTION component in de parameter @hints van de planhandleiding ook de NOLOCK hint bevatten. Zie voorbeeld van K.

Hints opgeven met Query Store-hints

U kunt hints afdwingen voor query's die zijn geïdentificeerd via Query Store zonder codewijzigingen aan te brengen, met behulp van de Query Store-hints functie. Gebruik de sys.sp_query_store_set_hints opgeslagen procedure om een hint toe te passen op een query. Zie voorbeeld N.

Ondersteuning voor queryhints in Fabric Data Warehouse

Microsoft Fabric Data Warehouse ondersteunt een subset van queryhints:

  • 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

Deze queryhints zijn exclusief voor Microsoft Fabric Data Warehouse:

  • FORCE SINGLE NODE PLAN, FORCE DISTRIBUTED PLAN

Voorbeelden

Eén. MERGE JOIN gebruiken

In het volgende voorbeeld wordt aangegeven dat MERGE JOIN de JOIN bewerking in de query uitvoert. In het voorbeeld wordt de AdventureWorks2022-database gebruikt.

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. OPTIMIZE FOR GEBRUIKEN

In het volgende voorbeeld wordt de queryoptimalisatie geïnstrueerd om de waarde 'Seattle' te gebruiken voor @city_name en om de gemiddelde selectiviteit van het predicaat te gebruiken voor alle kolomwaarden voor @postal_code bij het optimaliseren van de query. In het voorbeeld wordt de AdventureWorks2022-database gebruikt.

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. MAXRECURSION gebruiken

MAXRECURSION kan worden gebruikt om te voorkomen dat een slecht gevormde algemene tabelexpressie in een oneindige lus terechtkomt. In het volgende voorbeeld wordt opzettelijk een oneindige lus gemaakt en wordt de MAXRECURSION hint gebruikt om het aantal recursieniveaus te beperken tot twee. In het voorbeeld wordt de AdventureWorks2022-database gebruikt.

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

Nadat de coderingsfout is gecorrigeerd, is MAXRECURSION niet meer vereist.

D. MERGE UNION gebruiken

In het volgende voorbeeld wordt de MERGE UNION queryhint gebruikt. In het voorbeeld wordt de AdventureWorks2022-database gebruikt.

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

E. HASH-GROEP en SNEL gebruiken

In het volgende voorbeeld worden de HASH GROUP en FAST queryhints gebruikt. In het voorbeeld wordt de AdventureWorks2022-database gebruikt.

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. MAXDOP gebruiken

In het volgende voorbeeld wordt de MAXDOP queryhint gebruikt. In het voorbeeld wordt de AdventureWorks2022-database gebruikt.

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. INDEX gebruiken

In de volgende voorbeelden wordt de INDEX hint gebruikt. In het eerste voorbeeld wordt één index opgegeven. In het tweede voorbeeld worden meerdere indexen voor één tabelreferentie opgegeven. In beide voorbeelden, omdat u de INDEX hint toepast op een tabel die gebruikmaakt van een alias, moet de TABLE HINT component ook dezelfde alias opgeven als de naam van het weergegeven object. In het voorbeeld wordt de AdventureWorks2022-database gebruikt.

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. FORCESEEK gebruiken

In het volgende voorbeeld wordt de FORCESEEK tabelhint gebruikt. De TABLE HINT-component moet ook dezelfde tweedelige naam opgeven als de naam van het weergegeven object. Geef de naam op wanneer u de INDEX hint toepast op een tabel die een tweedelige naam gebruikt. In het voorbeeld wordt de AdventureWorks2022-database gebruikt.

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. Meerdere tabelhints gebruiken

In het volgende voorbeeld wordt de INDEX hint toegepast op de ene tabel en de FORCESEEK hint op een andere. In het voorbeeld wordt de AdventureWorks2022-database gebruikt.

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. TABLE HINT gebruiken om een bestaande tabelhint te overschrijven

In het volgende voorbeeld ziet u hoe u de TABLE HINT hint gebruikt. U kunt de hint gebruiken zonder een hint op te geven om het gedrag van de INDEX tabelhint te overschrijven die u opgeeft in de FROM component van de query. In het voorbeeld wordt de AdventureWorks2022-database gebruikt.

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. Semantiek-beïnvloedende tabelhints opgeven

Het volgende voorbeeld bevat twee tabelhints in de query: NOLOCK, wat semantisch van invloed is en INDEX, wat niet-semantisch van invloed is. Als u de semantiek van de query wilt behouden, wordt de NOLOCK hint opgegeven in de OPTIONS component van de planhandleiding. Geef samen met de NOLOCK hint de INDEX en FORCESEEK hints op en vervang de niet-semantische INDEX hint in de query tijdens het compileren en optimaliseren van de instructie. In het voorbeeld wordt de AdventureWorks2022-database gebruikt.

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

In het volgende voorbeeld ziet u een alternatieve methode voor het behouden van de semantiek van de query en waarmee de optimizer een andere index kan kiezen dan de index die is opgegeven in de tabelhint. Hiermee staat u toe dat de optimizer ervoor kiest door de NOLOCK hint op te geven in de OPTIONS component. U geeft de hint op omdat deze semantisch van invloed is. Geef vervolgens het TABLE HINT trefwoord op met alleen een tabelreferentie en geen INDEX hint. In het voorbeeld wordt de AdventureWorks2022-database gebruikt.

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. GEBRUIK HINT

In het volgende voorbeeld worden de RECOMPILE en USE HINT queryhints gebruikt. In het voorbeeld wordt de AdventureWorks2022-database gebruikt.

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. HINT VOOR QUERYTRACEON gebruiken

In het volgende voorbeeld worden de QUERYTRACEON queryhints gebruikt. In het voorbeeld wordt de AdventureWorks2022-database gebruikt. U kunt alle plan-beïnvloede hotfixes inschakelen die worden beheerd door traceringsvlag 4199 voor een bepaalde query met behulp van de volgende query:

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

U kunt ook meerdere traceringsvlagmen gebruiken, zoals in de volgende query:

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

N. Query Store-hints gebruiken

De Query Store-hints functie in Azure SQL Database biedt een gebruiksvriendelijke methode voor het vormgeven van queryplannen zonder toepassingscode te wijzigen.

Identificeer eerst de query die al is uitgevoerd in de Query Store-catalogusweergaven, bijvoorbeeld:

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

In het volgende voorbeeld wordt de hint toegepast om de verouderde kardinaliteitsschatter af te dwingen op query_id 39, geïdentificeerd in Query Store:

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

In het volgende voorbeeld wordt de hint toegepast om een maximale geheugentoekenningsgrootte af te dwingen in PERCENT van de geconfigureerde geheugenlimiet op query_id 39, geïdentificeerd in Query Store:

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

In het volgende voorbeeld worden meerdere queryhints toegepast op query_id 39, waaronder RECOMPILE, MAXDOP 1en het optimalisatiegedrag voor query's van SQL Server 2012 (11.x):

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

O. Gegevens opvragen vanaf een bepaald tijdstip

van toepassing op: Warehouse in Microsoft Fabric

Gebruik de TIMESTAMP syntaxis in de OPTION-component om gegevens op te vragen zoals deze in het verleden bestonden, in Synapse Data Warehouse in Microsoft Fabric. De volgende voorbeeldquery retourneert gegevens zoals weergegeven op 13 maart 2024 om 17:39:35.28 UUR UTC. De tijdzone bevindt zich altijd in 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