Dela via


Frågetips (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-analysslutpunkt i Microsoft FabricWarehouse i Microsoft FabricSQL-databas i Microsoft Fabric

Frågetips anger att angivna tips används i omfånget för en fråga. De påverkar alla operatorer i -instruktionen. Om UNION är involverad i huvudfrågan kan endast den sista frågan som involverar en UNION-åtgärd ha OPTION-satsen. Frågetips anges som en del av OPTION-satsen. Fel 8622 uppstår om en eller flera frågetips gör att frågeoptimeraren inte genererar en giltig plan.

Försiktighet

Eftersom SQL Server Query Optimizer vanligtvis väljer den bästa körningsplanen för en fråga rekommenderar vi att du bara använder tips som en sista utväg för erfarna utvecklare och databasadministratörer.

gäller för:

Transact-SQL syntaxkonventioner

Syntax

<query_hint> ::=
{ { HASH | ORDER } GROUP
  | { CONCAT | HASH | MERGE } UNION
  | { LOOP | MERGE | HASH } JOIN
  | DISABLE_OPTIMIZED_PLAN_FORCING
  | EXPAND VIEWS
  | FAST <integer_value>
  | FORCE ORDER
  | { FORCE | DISABLE } EXTERNALPUSHDOWN
  | { FORCE | DISABLE } SCALEOUTEXECUTION
  | IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
  | KEEP PLAN
  | KEEPFIXED PLAN
  | MAX_GRANT_PERCENT = <numeric_value>
  | MIN_GRANT_PERCENT = <numeric_value>
  | MAXDOP <integer_value>
  | MAXRECURSION <integer_value>
  | NO_PERFORMANCE_SPOOL
  | OPTIMIZE FOR ( @variable_name { UNKNOWN | = <literal_constant> } [ , ...n ] )
  | OPTIMIZE FOR UNKNOWN
  | PARAMETERIZATION { SIMPLE | FORCED }
  | QUERYTRACEON <integer_value>
  | RECOMPILE
  | ROBUST PLAN
  | USE HINT ( <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 } GRUPP

Anger att sammansättningar som frågans GROUP BY- eller DISTINCT-sats beskriver ska använda hashning eller ordning.

  • I allmänhet kan en hash-baserad algoritm förbättra prestandan för frågor som omfattar stora eller komplexa grupperingsuppsättningar.
  • I allmänhet kan en sorteringsbaserad algoritm förbättra prestandan för frågor som omfattar små eller enkla grupperingsuppsättningar.

{ MERGE | HASH | CONCAT } UNION

Anger att alla UNION åtgärder körs genom sammanslagning, hashning eller sammanfogning av UNION uppsättningar. Om fler än en UNION tips anges väljer Frågeoptimeraren den billigaste strategin från de angivna tipsen.

  • I allmänhet kan en sammanslagningsbaserad algoritmåtgärd förbättra prestandan för frågor som omfattar sorterade indata.
  • I allmänhet kan en hash-baserad algoritm förbättra prestandan för frågor som omfattar osorterade eller stora indata.
  • I allmänhet kan en sammanlänkningsbaserad algoritm förbättra prestandan för frågor som omfattar distinkta eller små indata.

{ LOOP | MERGE | HASH } JOIN

Anger att alla kopplingsåtgärder utförs av LOOP JOIN, MERGE JOINeller HASH JOIN i hela frågan. Om du anger fler än en kopplingstips väljer optimeraren den billigaste kopplingsstrategin från de tillåtna.

Om du anger ett kopplingstips i samma frågas FROM-sats för ett specifikt tabellpar har det här kopplingstipset företräde i kopplingen av de två tabellerna. Frågetipsen måste dock fortfarande respekteras. Kopplingstipset för tabellparet kan bara begränsa valet av tillåtna kopplingsmetoder i frågetipset. Mer information finns i Join-tips.

DISABLE_OPTIMIZED_PLAN_FORCING

gäller för: SQL Server (från och med SQL Server 2022 (16.x))

Inaktiverar optimerad plan som tvingar för en fråga.

Optimerad plan framtvingning minskar kompileringskostnaderna för upprepade framtvingade frågor. När frågekörningsplanen har genererats lagras specifika kompileringssteg för återanvändning som ett optimeringsreprisskript. Ett optimeringsreprisskript lagras som en del av den komprimerade showplan-XML:en i Query Storei ett dolt OptimizationReplay-attribut.

EXPANDERA VYER

Anger att de indexerade vyerna expanderas. Anger också att Frågeoptimeraren inte anser att någon indexerad vy ersätter någon frågedel. En vy expanderas när vydefinitionen ersätter visningsnamnet i frågetexten.

Det här frågetipset tillåter praktiskt taget inte direkt användning av indexerade vyer och index på indexerade vyer i frågeplanen.

Anmärkning

Den indexerade vyn förblir komprimerad om det finns en direkt referens till vyn i frågans SELECT del. Vyn förblir också komprimerad om du anger WITH (NOEXPAND) eller WITH (NOEXPAND, INDEX( <index_value> [ , *...n* ] ) ). Mer information om frågetipset NOEXPANDfinns i Using NOEXPAND.

Tipset påverkar bara vyerna i instruktionens SELECT del, inklusive vyerna i INSERT, UPDATE, MERGEoch DELETE-instruktioner.

FAST-integer_value

Anger att frågan är optimerad för snabb hämtning av det första integer_value antalet rader. Det här resultatet är ett heltal som inte är negativt. När det första integer_value antalet rader returneras fortsätter frågan att köras och genererar sin fullständiga resultatuppsättning.

FORCE ORDER

Anger att kopplingsordningen som anges av frågesyntaxen bevaras under frågeoptimeringen. Att använda FORCE ORDER påverkar inte det möjliga rollåtervändningsbeteendet för frågeoptimeraren.

FORCE ORDER bevarar kopplingsordningen som anges i frågan, vilket kan förbättra prestanda eller konsekvens för frågor som omfattar komplexa kopplingsvillkor eller tips.

Anmärkning

I en MERGE-instruktion används källtabellen före måltabellen som standardanslutningsordning, såvida inte WHEN SOURCE NOT MATCHED-satsen anges. Om du anger FORCE ORDER bevaras det här standardbeteendet.

{ FORCE | INAKTIVERA } EXTERNALPUSHDOWN

Framtvinga eller inaktivera pushdown för beräkningen av kvalificerande uttryck i Hadoop. Gäller endast för frågor som använder PolyBase. Push-överför inte till Azure Storage.

{ FORCE | INAKTIVERA } SCALEOUTEXECUTION

Framtvinga eller inaktivera utskalningskörning av PolyBase-frågor som använder externa tabeller i SQL Server 2019 Big Data Clusters. Det här tipset respekteras bara av en fråga med hjälp av huvudinstansen av ett SQL Big Data-kluster. Utskalningen sker över beräkningspoolen i stordataklustret.

BEHÅLL PLAN

Ändrar tröskelvärdena för omkompilering för temporära tabeller och gör dem identiska med tröskelvärdena för permanenta tabeller. Det uppskattade omkompileringströskelvärdet startar en automatisk omkompilering för frågan när det uppskattade antalet indexerade kolumnändringar görs i en tabell genom att köra någon av följande instruktioner:

  • UPDATE
  • DELETE
  • MERGE
  • INSERT

Om du anger KEEP PLAN ser du till att en fråga inte kompileras om lika ofta när det finns flera uppdateringar i en tabell.

KEEPFIXED PLAN

Tvingar frågeoptimeraren att inte kompilera om en fråga på grund av ändringar i statistiken. Om du anger KEEPFIXED PLAN ser du till att en fråga endast kompilerar om schemat för de underliggande tabellerna ändras eller om sp_recompile körs mot dessa tabeller.

IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX

gäller för: SQL Server (från och med SQL Server 2012 (11.x)).

Förhindrar att frågan använder ett icke-illustrerat minnesoptimerad kolumnlagringsindex. Om frågan innehåller frågetipset för att undvika användning av columnstore-indexet och ett indextips för att använda ett columnstore-index är tipsen i konflikt och frågan returnerar ett fel.

MAX_GRANT_PERCENT = <numeric_value>

gäller för: SQL Server (från och med SQL Server 2012 (11.x) Service Pack 3, SQL Server 2014 (12.x) Service Pack 2 och Azure SQL Database.

Den maximala minnesanvändningsstorleken i PERCENT för konfigurerad minnesgräns. Frågan kommer garanterat inte att överskrida den här gränsen om frågan körs i en användardefinierad resurspool. I det här fallet, om frågan inte har det minsta minne som krävs, genererar systemet ett fel. Om en fråga körs i systempoolen (standard) får den minst det minne som krävs för att köras. Den faktiska gränsen kan vara lägre om inställningen Resource Governor är lägre än det värde som anges i det här tipset. Giltiga värden är mellan 0.0 och 100.0.

Tipset om minnesbidrag är inte tillgängligt för att skapa index eller återskapa index.

MIN_GRANT_PERCENT = <numeric_value>

gäller för: SQL Server (från och med SQL Server 2012 (11.x) Service Pack 3, SQL Server 2014 (12.x) Service Pack 2 och Azure SQL Database.

Minsta storlek på minnesbidrag i PERCENT för konfigurerad minnesgräns. Frågan kommer garanterat att hämta MAX(required memory, min grant) eftersom det krävs minst minne för att starta en fråga. Giltiga värden är mellan 0.0 och 100.0.

Alternativet min_grant_percent minnesbidrag åsidosätter alternativet sp_configure (minsta minne per fråga (KB)) oavsett storlek. Tipset om minnesbidrag är inte tillgängligt för att skapa index eller återskapa index.

MAXDOP-<integer_value>

gäller för: SQL Server (från och med SQL Server 2008 (10.0.x)) och Azure SQL Database.

Åsidosätter maximal grad av parallellitet konfigurationsalternativet för sp_configure. Åsidosätter även Resource Governor för frågan som anger det här alternativet. Frågetipset MAXDOP kan överskrida värdet som konfigurerats med sp_configure. Om MAXDOP överskrider det värde som konfigurerats med Resource Governor använder databasmotorn värdet Resource Governor MAXDOP, som beskrivs i ALTER WORKLOAD GROUP. Alla semantiska regler som används med maximal grad av parallellitet konfigurationsalternativ gäller när du använder MAXDOP frågetips. Mer information finns i Konfigurera den maximala graden av parallellitet serverkonfigurationsalternativ.

Varning

Om MAXDOP är inställt på noll väljer servern den maximala graden av parallellitet.

MAXRECURSION <integer_value>

Anger det maximala antalet rekursioner som tillåts för den här frågan. talet är ett positivt heltal mellan 0 och 32 767. När 0 har angetts tillämpas ingen gräns. Om det här alternativet inte anges är standardgränsen för servern 100.

När det angivna eller standardnumret för MAXRECURSION gränsen nås under frågekörningen avslutas frågan och ett fel returneras.

På grund av det här felet återställs alla effekter av -instruktionen. Om -instruktionen är en SELECT-instruktion kan partiella resultat eller inga resultat returneras. Eventuella partiella resultat som returneras kanske inte innehåller alla rader på rekursionsnivåer utöver den angivna maximala rekursionsnivån.

Mer information finns i WITH common_table_expression.

NO_PERFORMANCE_SPOOL

gäller för: SQL Server (från och med SQL Server 2016 (13.x)) och Azure SQL Database.

Förhindrar att en spooloperator läggs till i frågeplaner (förutom de planer då spool krävs för att garantera giltig uppdateringssemantik). Spooloperatorn kan minska prestanda i vissa scenarier. Spoolen använder till exempel tempdb, och tempdb konkurrens kan uppstå om det finns många samtidiga frågor som körs med spoolåtgärderna.

OPTIMERA FÖR ( @variable_name { OKÄND | = <literal_constant> } [ , ... n ] )

Instruerar frågeoptimeraren att använda ett visst värde för en lokal variabel när frågan kompileras och optimeras. Värdet används endast under frågeoptimering och inte under frågekörningen.

  • @variable_name

    Namnet på en lokal variabel som används i en fråga, till vilken ett värde kan tilldelas för användning med OPTIMIZE FOR frågetips.

  • UNKNOWN

    Anger att frågeoptimeraren använder statistiska data i stället för det ursprungliga värdet för att fastställa värdet för en lokal variabel under frågeoptimeringen.

  • literal_constant

    Ett literalkonstantvärde som ska tilldelas @variable_name för användning med OPTIMIZE FOR frågetips. literal_constant används endast under frågeoptimering och inte som värdet för @variable_name under frågekörningen. literal_constant kan vara av valfri SQL Server-systemdatatyp som kan uttryckas som en literalkonstant. Datatypen för literal_constant måste implicit konverteras till den datatyp som @variable_name referenser i frågan.

OPTIMERA FÖR kan motverka optimerarens standardbeteende för parameteridentifiering. Använd även OPTIMIZE FOR när du skapar planguider. Mer information finns i Kompilera om en lagrad procedur.

OPTIMERA FÖR OKÄNT

Instruerar frågeoptimeraren att använda den genomsnittliga selektiviteten för predikatet för alla kolumnvärden, i stället för att använda körningsparametervärdet när frågan kompileras och optimeras.

Om du använder OPTIMIZE FOR @variable_name = <literal_constant> och OPTIMIZE FOR UNKNOWN i samma frågetips använder frågeoptimeraren den literal_constant som angetts för ett specifikt värde. Frågeoptimeraren använder UNKNOWN för resten av variabelvärdena. Värdena används endast under frågeoptimering och inte under frågekörningen.

PARAMETERIZATION { SIMPLE | FORCED }

Anger de parameteriseringsregler som SQL Server Query Optimizer tillämpar på frågan när den kompileras.

Viktigt!

Det PARAMETERIZATION frågetipset kan bara anges i en planguide för att åsidosätta den aktuella inställningen för alternativet PARAMETERIZATION databas SET. Det kan inte anges direkt i en fråga.

Mer information finns i Ange beteende för frågeparameterisering med hjälp av planguider.

SIMPLE instruerar frågeoptimeraren att försöka med enkel parameterisering. FORCED instruerar frågeoptimeraren att försöka tvingad parameterisering. Mer information finns i tvingad parameterisering i arkitekturguiden för frågebearbetningoch enkel parameterisering i arkitekturguiden för frågebearbetning.

QUERYTRACEON <integer_value>

Med det här alternativet kan du aktivera en plan som påverkar spårningsflaggan endast under kompilering med en fråga. Precis som andra alternativ på frågenivå kan du använda den tillsammans med planguider för att matcha texten i en fråga som körs från en session och automatiskt använda en plan som påverkar spårningsflaggan när den här frågan kompileras. Alternativet QUERYTRACEON stöds endast för query optimizer-spårningsflaggor. Mer information finns i Spårningsflaggor.

Om du använder det här alternativet returneras inga fel eller varningar om ett spårningsflagganummer som inte stöds används. Om den angivna spårningsflaggan inte är en som påverkar en frågekörningsplan ignoreras alternativet tyst.

Om du vill använda mer än en spårningsflagga i en fråga anger du ett QUERYTRACEON tips för varje enskilt spårningsflagganummer.

RECOMPILE

Instruerar SQL Server Database Engine att generera en ny, tillfällig plan för frågan och omedelbart ta bort planen när frågan har slutfört körningen. Den genererade frågeplanen ersätter inte en plan som lagras i cacheminnet när samma fråga körs utan RECOMPILE tips. Utan att ange RECOMPILEcachelagrar databasmotorn frågeplaner och återanvänder dem. När frågeplaner kompileras använder RECOMPILE frågetips de aktuella värdena för eventuella lokala variabler i frågan. Om frågan finns i en lagrad procedur skickas de aktuella värdena till alla parametrar.

RECOMPILE är ett användbart alternativ till att skapa en lagrad procedur. RECOMPILE använder WITH RECOMPILE-satsen när endast en delmängd frågor i den lagrade proceduren, i stället för hela den lagrade proceduren, måste kompileras om. Mer information finns i Kompilera om en lagrad procedur. RECOMPILE är också användbart när du skapar planguider.

ROBUST PLAN

Tvingar Frågeoptimeraren att prova en plan som fungerar för den maximala potentiella radstorleken, eventuellt på bekostnad av prestanda. När frågan bearbetas kan mellanliggande tabeller och operatorer behöva lagra och bearbeta rader som är bredare än någon av indataraderna när frågan bearbetas. Raderna kan vara så breda att den specifika operatorn ibland inte kan bearbeta raden. Om raderna är så breda genererar databasmotorn ett fel under frågekörningen. Med hjälp av ROBUST PLANinstruerar du frågeoptimeraren att inte överväga några frågeplaner som kan stöta på det här problemet.

Om en sådan plan inte är möjlig returnerar Frågeoptimeraren ett fel i stället för att skjuta upp felidentifiering till frågekörning. Rader kan innehålla kolumner med variabel längd. Databasmotorn gör att rader kan definieras som har en maximal potentiell storlek utöver databasmotorns möjlighet att bearbeta dem. Trots den maximala potentiella storleken lagrar ett program i allmänhet rader som har faktiska storlekar inom de gränser som databasmotorn kan bearbeta. Om databasmotorn stöter på en rad som är för lång returneras ett körningsfel.

ANVÄND TIPS ( 'hint_name' )

gäller för: SQL Server (från och med SQL Server 2016 (13.x) SP1) och Azure SQL Database.

Ger en eller flera extra tips till frågeprocessorn. De extra tipsen anges med ett tipsnamn inom enkla citattecken.

Tips

Tipsnamn är skiftlägeskänsliga.

Följande tipsnamn stöds:

Antydan Beskrivning
'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS' Genererar en frågeplan med antagandet Enkel inneslutning i stället för standardantagandet för grundläggande inneslutning för kopplingar, under Query Optimizer Cardinality Estimation modell för SQL Server 2014 (12.x) och senare versioner. Det här tipsnamnet motsvarar spårningsflagga 9476.
'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES' Genererar en plan med minimal selektivitet när du beräknar OCH predikat för filter för att ta hänsyn till fullständig korrelation. Det här tipsnamnet motsvarar Spårningsflagga 4137 när det används med kardinalitetsuppskattningsmodellen för SQL Server 2012 (11.x) och tidigare versioner och har liknande effekt när spårningsflagga 9471 används med kardinalitetsuppskattningsmodellen för SQL Server 2014 (12.x) och senare versioner.
'ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES' Genererar en plan med maximal selektivitet när du beräknar OCH predikat för filter som ska ta hänsyn till fullständigt oberoende. Det här tipsnamnet är standardbeteendet för kardinalitetsuppskattningsmodellen för SQL Server 2012 (11.x) och tidigare versioner, och motsvarar spårningsflagga 9472 när den används med kardinalitetsuppskattningsmodellen för SQL Server 2014 (12.x) och senare versioner.

gäller för: Azure SQL Database
'ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES' Genererar en plan som använder mest till minst selektivitet när du beräknar OCH predikat för filter som ska ta hänsyn till partiell korrelation. Det här tipsnamnet är standardbeteendet för modellen för kardinalitetsuppskattning i SQL Server 2014 (12.x) och senare versioner.

gäller för: Azure SQL Database
'DISABLE_BATCH_MODE_ADAPTIVE_JOINS' Inaktiverar anpassningsbara kopplingar i batchläge. Mer information finns i Batch-läge Adaptiva kopplingar.

gäller för: SQL Server 2017 (14.x) och senare versioner och Azure SQL Database
'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK' Inaktiverar feedback om minnesåtergivning i batchläge. Mer information finns i Minnesåtergivning i Batch-läge.

gäller för: SQL Server 2017 (14.x) och senare versioner och Azure SQL Database
'DISABLE_DEFERRED_COMPILATION_TV' Inaktiverar uppskjuten kompilering av tabellvariabel. Mer information finns i Tabellvariabeln uppskjuten kompilering.

gäller för: SQL Server 2019 (15.x) och senare versioner och Azure SQL Database
'DISABLE_INTERLEAVED_EXECUTION_TVF' Inaktiverar interfolierad körning för tabellvärdesfunktioner med flera instruktioner. Mer information finns i Interleaved-körning för tabellvärdesfunktioner med flera instruktioner.

gäller för: SQL Server 2017 (14.x) och senare versioner och Azure SQL Database
'DISABLE_OPTIMIZED_NESTED_LOOP' Instruerar frågeprocessorn att inte använda en sorteringsåtgärd (batchsortering) för optimerade kapslade loopkopplingar när en frågeplan genereras. Det här tipsnamnet motsvarar spårningsflagga 2340. Det här tipset gäller även explicit sortering och batchsortering.
'DISABLE_OPTIMIZER_ROWGOAL' Gör att SQL Server genererar en plan som inte använder radmåländringar med frågor som innehåller dessa nyckelord:

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

Det här tipsnamnet motsvarar spårningsflagga 4138.
'DISABLE_PARAMETER_SNIFFING' Instruerar Query Optimizer att använda genomsnittlig datadistribution vid kompilering av en fråga med en eller flera parametrar. Den här instruktionen gör frågeplanen oberoende av parametervärdet som först användes när frågan kompilerades. Det här tipsnamnet motsvarar spårningsflagga 4136 eller databasomfattningskonfiguration inställning PARAMETER_SNIFFING = OFF.
'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK' Inaktiverar feedback om minnesåtergivning i radläge. Mer information finns i Minnesåtergivning för radläge.

gäller för: SQL Server 2019 (15.x) och senare versioner och Azure SQL Database
'DISABLE_TSQL_SCALAR_UDF_INLINING' Inaktiverar skalär UDF-inlining. Mer information finns i Scalar UDF-inlining.

gäller för: SQL Server 2019 (15.x) och senare versioner och Azure SQL Database
'DISALLOW_BATCH_MODE' Inaktiverar körning av batchläge. Mer information finns i körningslägen.

gäller för: SQL Server 2019 (15.x) och senare versioner och Azure SQL Database
'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS' Aktiverar automatiskt genererad snabbstatistik (histogramändring) för alla inledande indexkolumner för vilka kardinalitetsuppskattning behövs. Histogrammet som används för att uppskatta kardinaliteten justeras vid frågekompileringstiden för att ta hänsyn till det faktiska maximala eller lägsta värdet för den här kolumnen. Det här tipsnamnet motsvarar spårningsflagga 4139.
'ENABLE_QUERY_OPTIMIZER_HOTFIXES' Aktiverar snabbkorrigeringar för frågeoptimeraren (ändringar som släppts i kumulativa UPPDATERINGAR och Service Pack för SQL Server). Det här tipsnamnet motsvarar spårningsflagga 4199 eller databasomfattande konfiguration inställning QUERY_OPTIMIZER_HOTFIXES = ON.
'FORCE_DEFAULT_CARDINALITY_ESTIMATION' Tvingar frågeoptimeraren att använda kardinalitetsuppskattning modell som motsvarar den aktuella databaskompatibilitetsnivån. Använd det här tipset om du vill åsidosätta databasomfattande konfiguration inställning LEGACY_CARDINALITY_ESTIMATION = ON eller spårningsflagga 9481.
'FORCE_LEGACY_CARDINALITY_ESTIMATION' Tvingar frågeoptimeraren att använda kardinalitetsuppskattning modell av SQL Server 2012 (11.x) och tidigare versioner. Det här tipsnamnet motsvarar spårningsflagga 9481 eller databasomfattande konfiguration inställning LEGACY_CARDINALITY_ESTIMATION = ON.
'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n' 1 Tvingar frågeoptimerarbeteendet på frågenivå. Det här beteendet inträffar som om frågan kompilerades med databaskompatibilitetsnivån n, där n är en databaskompatibilitetsnivå som stöds. En lista över värden som stöds för nfinns i sys.dm_exec_valid_use_hints.

gäller för: SQL Server 2017 (14.x) CU 10 och senare versioner och Azure SQL Database
'QUERY_PLAN_PROFILE' 2 Möjliggör enkel profilering för frågan. När en fråga som innehåller det här nya tipset är klar utlöses en ny utökad händelse, query_plan_profile. Den här utökade händelsen exponerar körningsstatistik och faktisk körningsplan-XML som liknar den query_post_execution_showplan utökade händelsen, men endast för frågor som innehåller det nya tipset.

gäller för: SQL Server 2016 (13.x) SP 2 CU 3, SQL Server 2017 (14.x) CU 11 och senare versioner

1 Tipset QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n åsidosätter inte standardinställningen eller den äldre kardinalitetsuppskattningen, om du tvingar den genom databasomfattande konfiguration, spårningsflagga eller något annat frågetips som QUERYTRACEON. Det här tipset påverkar bara beteendet för frågeoptimeraren. Det påverkar inte andra funktioner i SQL Server som kan bero på databaskompatibilitetsnivå, till exempel tillgängligheten för vissa databasfunktioner. Mer information finns i Developer's Choice: Hinting Query Execution model.

2 Om du aktiverar insamling av den query_post_execution_showplan utökade händelsen läggs standardprofileringsinfrastrukturen till i varje fråga som körs på servern och kan därför påverka den övergripande serverprestandan. Om du aktiverar insamlingen av query_thread_profile utökad händelse för att använda infrastruktur för enkel profilering i stället resulterar detta i mycket mindre prestandaomkostnader men påverkar fortfarande den övergripande serverprestandan. Om du aktiverar den query_plan_profile utökade händelsen aktiverar detta endast den enkla profileringsinfrastrukturen för en fråga som körs med query_plan_profile och därför inte påverkar andra arbetsbelastningar på servern. Använd det här tipset för att profilera en specifik fråga utan att påverka andra delar av serverarbetsbelastningen. Mer information om enkel profilering finns i Infrastruktur för frågeprofilering.

Listan över alla USE HINT namn som stöds kan efterfrågas med hjälp av den dynamiska hanteringsvyn sys.dm_exec_valid_use_hints.

Viktigt!

Vissa USE HINT tips kan vara i konflikt med spårningsflaggor som är aktiverade på global nivå eller sessionsnivå eller databasomfattande konfigurationsinställningar. I det här fallet har frågenivåtipset (USE HINT) alltid företräde. Om en USE HINT står i konflikt med ett annat frågetips eller en spårningsflagga som är aktiverad på frågenivå (till exempel genom QUERYTRACEON) genererar SQL Server ett fel när frågan körs.

ANVÄND PLAN N"xml_plan"

Tvingar frågeoptimeraren att använda en befintlig frågeplan för en fråga som anges av xml_plan. USE PLAN kan inte anges med INSERT, UPDATE, MERGEeller DELETE-instruktioner.

Den resulterande körningsplanen som framtvingas av den här funktionen är densamma eller liknar den plan som tvingas fram. Eftersom den resulterande planen kanske inte är identisk med den plan som anges av USE PLANkan planernas prestanda variera. I sällsynta fall kan prestandaskillnaden vara betydande och negativ. I så fall måste administratören ta bort den framtvingade planen.

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

Tillämpar den angivna tabelltipset på tabellen eller vyn som motsvarar exposed_object_name. Vi rekommenderar att du bara använder ett tabelltips som ett frågetips i kontexten för en -planguide.

exposed_object_name kan vara en av följande referenser:

  • När ett alias används för tabellen eller vyn i FROM--satsen i frågan är exposed_object_name aliaset.

  • När ett alias inte används är exposed_object_name den exakta matchningen av tabellen eller vyn som refereras i FROM-satsen. Om tabellen eller vyn till exempel refereras med ett tvådelade namn är exposed_object_name samma tvådelade namn.

När du anger exposed_object_name utan att ange ett tabelltips ignoreras alla index som du anger i frågan som en del av ett tabelltips för objektet. Frågeoptimeraren avgör sedan indexanvändningen. Du kan använda den här tekniken för att eliminera effekten av en INDEX tabelltips när du inte kan ändra den ursprungliga frågan. Se J-exempel.

<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 | ÖGONBLICKSBILD | SPATIAL_WINDOW_MAX_CELLS = integer_value | TABLOCK | TABLOCKX | UPDLOCK | XLOCK

Tabelltipset som ska tillämpas på tabellen eller vyn som motsvarar exposed_object_name som ett frågetips. En beskrivning av dessa tips finns i Tabelltips.

Andra tabelltips än INDEX, FORCESCANoch FORCESEEK tillåts inte som frågetips om inte frågan redan har en WITH-sats som anger tabelltipset. Mer information finns i avsnittet Kommentarer.

Försiktighet

Om du anger FORCESEEK med parametrar begränsas antalet planer som kan beaktas av frågeoptimeraren mer än när du anger FORCESEEK utan parametrar. Detta kan leda till att felet "Planen kan inte genereras" inträffar i fler fall.

FÖR TIDSSTÄMPEL FRÅN och med "point_in_time"

gäller för: Microsoft Fabric Data Warehouse

Använd syntaxen TIMESTAMP i OPTION-satsen för att fråga efter data som tidigare, en del av tidsresefunktionen i Synapse Data Warehouse i Microsoft Fabric.

Ange point_in_time i formatet yyyy-MM-ddTHH:mm:ss[.fff] för att returnera data som de visades vid den tidpunkten. Tidszonen finns alltid i UTC. Använd CONVERT syntaxen för det datumtidsformat som krävs med format 126.

Det TIMESTAMP AS OF tipset kan bara anges en gång med hjälp av OPTION-satsen. Mer information och begränsningar finns i Query data as it existed in the past.

FORCE [ SINGLE NODE | DISTRIBUERAD ] PLAN

gäller för: Microsoft Fabric Data Warehouse

Tillåter användaren att välja om en enskild nodplan ska framtvingas eller en distribuerad plan för frågekörning.

Anmärkningar

Frågetips kan inte anges i en INSERT-instruktion, förutom när en SELECT-sats används i -instruktionen.

Frågetips kan endast anges i frågan på den översta nivån, inte i underfrågor. När ett tabelltips anges som ett frågetips kan tipset anges i frågan på den översta nivån eller i en underfråga. Värdet som anges för exposed_object_name i TABLE HINT-satsen måste dock matcha exakt det exponerade namnet i frågan eller underfrågan.

Ange tabelltips som frågetips

Vi rekommenderar att du använder INDEX, FORCESCANeller FORCESEEK tabelltips som ett frågetips endast i kontexten för en -planguide. Planguider är användbara när du inte kan ändra den ursprungliga frågan, till exempel eftersom det är ett program från tredje part. Frågetipset som anges i planguiden läggs till i frågan innan den kompileras och optimeras. För ad hoc-frågor använder du endast TABLE HINT-satsen när du testar planguideinstruktioner. För alla andra ad hoc-frågor rekommenderar vi att du endast anger dessa tips som tabelltips.

När det anges som ett frågetips är INDEX, FORCESCANoch FORCESEEK tabelltips giltiga för följande objekt:

  • Tabeller
  • Visningar
  • Indexerade vyer
  • Vanliga tabelluttryck (tipset måste anges i SELECT-instruktionen vars resultatuppsättning fyller det gemensamma tabelluttrycket)
  • Dynamiska hanteringsvyer (DMV:er)
  • Namngivna underfrågor

Du kan ange INDEX, FORCESCANoch FORCESEEK tabelltips som frågetips för en fråga som inte har några befintliga tabelltips. Du kan också använda dem för att ersätta befintliga INDEX, FORCESCANeller FORCESEEK tips i frågan.

Andra tabelltips än INDEX, FORCESCANoch FORCESEEK tillåts inte som frågetips om inte frågan redan har en WITH-sats som anger tabelltipset. I det här fallet måste ett matchande tips också anges som ett frågetips. Ange matchande tips som ett frågetips med hjälp av TABLE HINT i OPTION-satsen. Den här specifikationen bevarar frågans semantik. Om frågan till exempel innehåller tabelltipset NOLOCKmåste OPTION-satsen i parametern @hints i planguiden också innehålla NOLOCK tips. Se Exempel K.

Ange tips med Query Store-tips

Du kan framtvinga tips om frågor som identifieras via Query Store utan att göra kodändringar med hjälp av Query Store-tips funktion. Använd den sys.sp_query_store_set_hints lagrade proceduren för att tillämpa ett tips på en fråga. Se Exempel N.

Stöd för frågetips i Fabric Data Warehouse

Microsoft Fabric Data Warehouse stöder en delmängd frågetips:

  • 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

Dessa frågetips är exklusiva för Microsoft Fabric Data Warehouse:

  • FORCE SINGLE NODE PLAN, FORCE DISTRIBUTED PLAN

Exempel

A. Använda MERGE JOIN

I följande exempel anges att MERGE JOIN kör åtgärden JOIN i frågan. I exemplet används databasen AdventureWorks2022.

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. Använd OPTIMERA FÖR

I följande exempel instrueras frågeoptimeraren att använda värdet 'Seattle' för @city_name och att använda predikatets genomsnittliga selektivitet för alla kolumnvärden för @postal_code när frågan optimeras. I exemplet används databasen AdventureWorks2022.

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. Använda MAXRECURSION

MAXRECURSION kan användas för att förhindra att ett dåligt format rekursivt vanligt tabelluttryck kommer in i en oändlig loop. I följande exempel skapas avsiktligt en oändlig loop och MAXRECURSION tips används för att begränsa antalet rekursionsnivåer till två. I exemplet används databasen AdventureWorks2022.

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

När kodfelet har korrigerats krävs inte längre MAXRECURSION.

D. Använda MERGE UNION

I följande exempel används MERGE UNION frågetips. I exemplet används databasen AdventureWorks2022.

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

E. Använda HASH GROUP och FAST

I följande exempel används HASH GROUP och FAST frågetips. I exemplet används databasen AdventureWorks2022.

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. Använda MAXDOP

I följande exempel används MAXDOP frågetips. I exemplet används databasen AdventureWorks2022.

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. Använda INDEX

I följande exempel används tipset INDEX. Det första exemplet anger ett enda index. Det andra exemplet anger flera index för en enskild tabellreferens. Eftersom du använder INDEX tips på en tabell som använder ett alias i båda exemplen måste TABLE HINT-satsen också ange samma alias som det exponerade objektnamnet. I exemplet används databasen AdventureWorks2022.

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. Använda FORCESEEK

I följande exempel används FORCESEEK tabelltips. Satsen TABLE HINT måste också ange samma tvådelade namn som det exponerade objektnamnet. Ange namnet när du använder INDEX tips på en tabell som använder ett tvådelade namn. I exemplet används databasen AdventureWorks2022.

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

Jag. Använda flera tabelltips

I följande exempel tillämpas INDEX tips på en tabell och FORCESEEK tips på en annan. I exemplet används databasen AdventureWorks2022.

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. Använd TABELLTIPS för att åsidosätta ett befintligt tabelltips

I följande exempel visas hur du använder tipset TABLE HINT. Du kan använda tipset utan att ange ett tips för att åsidosätta det INDEX tabelltips som du anger i FROM-satsen i frågan. I exemplet används databasen AdventureWorks2022.

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. Ange semantik som påverkar tabelltips

Följande exempel innehåller två tabelltips i frågan: NOLOCK, som är semantisk-påverkar och INDEX, vilket inte påverkar semantiken. För att bevara frågans semantik anges NOLOCK-tipset i OPTIONS-satsen i planguiden. Tillsammans med tipset NOLOCK anger du INDEX och FORCESEEK tips och ersätter det icke-semantiska INDEX tipset i frågan vid kompilering och optimering av instruktionen. I exemplet används databasen AdventureWorks2022.

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

I följande exempel visas en alternativ metod för att bevara frågans semantik och låta optimeraren välja ett annat index än det index som anges i tabelltipset. Tillåt att optimeraren väljer genom att ange NOLOCK tips i OPTIONS-satsen. Du anger tipset eftersom det är semantiskt påverkande. Ange sedan nyckelordet TABLE HINT med endast en tabellreferens och inget INDEX tips. I exemplet används databasen AdventureWorks2022.

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. Använd ANVÄND TIPS

I följande exempel används RECOMPILE och USE HINT frågetips. I exemplet används databasen AdventureWorks2022.

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. Använd QUERYTRACEON-TIPS

I följande exempel används QUERYTRACEON frågetips. I exemplet används databasen AdventureWorks2022. Du kan aktivera alla planpåverkande snabbkorrigeringar som styrs av spårningsflagga 4199 för en viss fråga med hjälp av följande fråga:

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

Du kan också använda flera spårningsflaggor som i följande fråga:

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

N. Använda Query Store-tips

Query Store antyder funktion i Azure SQL Database är en lätthanterlig metod för att forma frågeplaner utan att ändra programkod.

Identifiera först frågan som redan har körts i katalogvyerna för Query Store, till exempel:

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

I följande exempel används tipset för att tvinga äldre kardinalitetsestimator till query_id 39, som identifieras i Query Store:

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

I följande exempel används tipset för att framtvinga en maximal minnesanvändningsstorlek i PERCENT konfigurerad minnesgräns till query_id 39, som identifieras i Query Store:

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

I följande exempel används flera frågetips för query_id 39, inklusive RECOMPILE, MAXDOP 1och SQL Server 2012 (11.x) frågeoptimerarbeteende:

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. Fråga efter data från och med en tidpunkt

gäller för: Warehouse i Microsoft Fabric

Använd TIMESTAMP syntaxen i OPTION-satsen för att fråga efter data som tidigare, i Synapse Data Warehouse i Microsoft Fabric. Följande exempelfråga returnerar data som de visades den 13 mars 2024 kl. 19:39:35.28 UTC. Tidszonen finns alltid i 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