Queryhints (Transact-SQL)
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL Analytics-eindpunt in Microsoft Fabric
Warehouse in Microsoft Fabric
SQL-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 JOIN
of 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
, MERGE
en 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 tempdb
en 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 RECOMPILE
op 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 PLAN
te 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
, MERGE
of 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
, FORCESCAN
en 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
, FORCESCAN
of 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
, FORCESCAN
en 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
, FORCESCAN
en FORCESEEK
tabelhints opgeven als queryhints voor een query die geen bestaande tabelhints bevat. U kunt ze ook gebruiken om bestaande INDEX
, FORCESCAN
of FORCESEEK
hints in de query te vervangen.
Andere tabelhints dan INDEX
, FORCESCAN
en 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 1
en 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