Dela via


Tabelltips (Transact-SQL)

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

Tabelltips används för att åsidosätta standardbeteendet för frågeoptimeraren under DML-instruktionen (datamanipuleringsspråk). Du kan ange en låsningsmetod, ett eller flera index, en frågebearbetningsåtgärd, till exempel en tabellgenomsökning eller indexsökning eller andra alternativ. Tabelltips anges i FROM-satsen i DML-instruktionen och påverkar endast tabellen eller vyn som refereras i den satsen.

Försiktighet

Eftersom SQL Server-frågeoptimeraren vanligtvis väljer den bästa körningsplanen för en fråga rekommenderar vi att tips endast används som en sista utväg av erfarna utvecklare och databasadministratörer.

gäller för:

Transact-SQL syntaxkonventioner

Syntax

WITH  ( <table_hint> [ [ , ] ...n ] )

<table_hint> ::=
{ NOEXPAND
  | 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
}

<table_hint_limited> ::=
{
    KEEPIDENTITY
  | KEEPDEFAULTS
  | HOLDLOCK
  | IGNORE_CONSTRAINTS
  | IGNORE_TRIGGERS
  | NOLOCK
  | NOWAIT
  | PAGLOCK
  | READCOMMITTED
  | READCOMMITTEDLOCK
  | READPAST
  | REPEATABLEREAD
  | ROWLOCK
  | SERIALIZABLE
  | SNAPSHOT
  | TABLOCK
  | TABLOCKX
  | UPDLOCK
  | XLOCK
}

Argument

MED ( <table_hint> ) [ [ , ] ...n ]

Med vissa undantag stöds tabelltips endast i FROM-satsen när tipsen anges med nyckelordet WITH. Tabelltips måste också anges med parenteser.

Viktig

Att utelämna nyckelordet WITH är en inaktuell funktion: Den här funktionen tas bort i en framtida version av SQL Server. Undvik att använda den här funktionen i nytt utvecklingsarbete och planera att ändra program som för närvarande använder den här funktionen.

Följande tabelltips tillåts med och utan nyckelordet WITH: NOLOCK, READUNCOMMITTED, UPDLOCK, REPEATABLEREAD, SERIALIZABLE, READCOMMITTED, TABLOCK, TABLOCKX, PAGLOCK, ROWLOCK, NOWAIT, READPAST, XLOCK, SNAPSHOToch NOEXPAND. När dessa tabelltips anges utan nyckelordet WITH ska tipsen anges ensam. Till exempel:

FROM t (TABLOCK)

När tipset anges med ett annat alternativ måste tipset anges med nyckelordet WITH:

FROM t WITH (TABLOCK, INDEX(myindex))

Vi rekommenderar att du använder kommatecken mellan tabelltips.

Viktig

Att avgränsa tips med blanksteg i stället för kommatecken är en inaktuell funktion: Den här funktionen tas bort i en framtida version av SQL Server. Undvik att använda den här funktionen i nytt utvecklingsarbete och planera att ändra program som för närvarande använder den här funktionen.

NOEXPAND

Anger att indexerade vyer inte utökas för att komma åt underliggande tabeller när frågeoptimeraren bearbetar frågan. Frågeoptimeraren behandlar vyn som en tabell med klustrat index. NOEXPAND gäller endast för indexerade vyer. Mer information finns i Använd NOEXPAND.

INDEX ( <index_value> [ , ...n ] ) | INDEX = ( <index_value> )

Syntaxen INDEX() anger namnen eller ID:na för ett eller flera index som ska användas av frågeoptimeraren när instruktionen bearbetas. Den alternativa INDEX = syntaxen anger ett enda indexvärde. Endast ett indextips per tabell kan anges.

Om det finns ett klustrat index tvingar INDEX(0) fram en klustrad indexgenomsökning och INDEX(1) tvingar fram en klustrad indexsökning eller sökning. Om det inte finns något klustrat index tvingar INDEX(0) fram en tabellgenomsökning och INDEX(1) tolkas som ett fel.

Om flera index används i en enda tipslista ignoreras dubbletter och resten av de listade indexen används för att hämta raderna i tabellen. Ordningen på indexen i indextipset är betydande. Ett tips för flera index framtvingar även index-ANDing, och frågeoptimeraren tillämpar så många villkor som möjligt på varje index som används. Om samlingen med antydda index inte innehåller alla kolumner som refereras av frågan utförs en hämtning för att hämta de återstående kolumnerna när SQL Server Database Engine hämtar alla indexerade kolumner.

Not

När ett indextips som refererar till flera index används i faktatabellen i en stjärnkoppling ignorerar optimeraren indextipset och returnerar ett varningsmeddelande. Index-ORing tillåts inte heller för en tabell med ett angivet indextips.

Det maximala antalet index i tabelltipset är 250 icke-grupperade index.

KEEPIDENTITY

Gäller endast i en INSERT-instruktion när alternativet BULK används med OPENROWSET.

Anger att identitetsvärdet eller värdena i den importerade datafilen ska användas för identitetskolumnen. Om KEEPIDENTITY inte anges verifieras identitetsvärdena för den här kolumnen men importeras inte, och frågeoptimeraren tilldelar automatiskt unika värden baserat på de startvärde och inkrementsvärden som anges när tabellen skapas.

Viktig

Om datafilen inte innehåller värden för identitetskolumnen i tabellen eller vyn, och identitetskolumnen inte är den sista kolumnen i tabellen, måste du hoppa över identitetskolumnen. Mer information finns i Använda en formatfil för att hoppa över ett datafält (SQL Server). Om en identitetskolumn hoppas över tilldelar frågeoptimeraren automatiskt unika värden för identitetskolumnen till de importerade tabellraderna.

Ett exempel som använder det här tipset i en INSERT ... SELECT * FROM OPENROWSET(BULK...)-instruktion finns i Behåll identitetsvärden vid massimport av data (SQL Server).

Information om hur du kontrollerar identitetsvärdet för en tabell finns i DBCC CHECKIDENT.

KEEPDEFAULTS

Gäller endast i en INSERT-instruktion när alternativet BULK används med OPENROWSET.

Anger infogning av en tabellkolumns standardvärde, om det finns något, i stället för NULL när dataposten saknar ett värde för kolumnen.

Ett exempel som använder det här tipset i en INSERT ... SELECT * FROM OPENROWSET(BULK...)-instruktion finns i Behåll null-värden eller standardvärden under massimport (SQL Server).

FORCESEEK [ ( <index_value> ( <index_column_name> [ , ...n ] ) ) ] ]

Anger att frågeoptimeraren endast använder en indexsökningsåtgärd som åtkomstsökväg till data i tabellen eller vyn.

Not

Från och med SQL Server 2008 R2 (10.50.x) Service Pack 1 kan även indexparametrar anges. I så fall tar frågeoptimeraren endast hänsyn till indexsökningsåtgärder via det angivna indexet med minst de angivna indexkolumnerna.

  • index_value

    Indexnamnet eller index-ID-värdet. Index-ID 0 (heap) kan inte anges. Om du vill returnera indexnamnet eller ID:t frågar du sys.indexes katalogvyn.

  • index_column_name

    Namnet på den indexkolumn som ska inkluderas i sökåtgärden. Att ange FORCESEEK med indexparametrar liknar att använda FORCESEEK med ett INDEX tips. Du kan dock få större kontroll över den åtkomstsökväg som används av frågeoptimeraren genom att ange både indexet som ska sökas efter och de indexkolumner som ska övervägas i sökåtgärden. Optimeraren kan överväga fler kolumner om det behövs. Om till exempel ett icke-grupperat index har angetts kan optimeraren välja att använda grupperade indexnyckelkolumner utöver de angivna kolumnerna.

Det FORCESEEK tipset kan anges på följande sätt.

Syntax Exempel Beskrivning
Utan ett index eller INDEX tips FROM dbo.MyTable WITH (FORCESEEK) Frågeoptimeraren tar endast hänsyn till indexsökningsåtgärder för att komma åt tabellen eller visa via ett relevant index.
Kombinerat med ett INDEX tips FROM dbo.MyTable WITH (FORCESEEK, INDEX (MyIndex)) Frågeoptimeraren överväger endast indexsökningsåtgärder för att komma åt tabellen eller visa via det angivna indexet.
Parametriserad genom att ange ett index och indexkolumner FROM dbo.MyTable WITH (FORCESEEK (MyIndex (col1, col2, col3))) Frågeoptimeraren överväger endast indexsökningsåtgärder för att komma åt tabellen eller visa via det angivna indexet med minst de angivna indexkolumnerna.

När du använder FORCESEEK tips (med eller utan indexparametrar) bör du överväga följande riktlinjer:

  • Tipset kan anges som ett tabelltips eller som ett frågetips. Mer information om frågetips finns i Frågetips (Transact-SQL).
  • Om du vill tillämpa FORCESEEK på en indexerad vy måste NOEXPAND tips också anges.
  • Tipset kan tillämpas högst en gång per tabell eller vy.
  • Tipset kan inte anges för en fjärrdatakälla. Fel 7377 returneras när FORCESEEK anges med ett indextips och fel 8180 returneras när FORCESEEK används utan indextips.
  • Om FORCESEEK resulterar i att inga planer hittas returneras fel 8622.

När FORCESEEK anges med indexparametrar gäller följande riktlinjer och begränsningar:

  • Tipset kan inte anges för en tabell som är målet för en INSERT, UPDATEeller DELETE-instruktion.
  • Tipset kan inte anges i kombination med ett INDEX tips eller ett annat FORCESEEK tips.
  • Minst en kolumn måste anges och den måste vara den inledande nyckelkolumnen.
  • Ytterligare indexkolumner kan anges, men det går inte att hoppas över nyckelkolumner. Om det angivna indexet till exempel innehåller nyckelkolumnerna a, boch cinnehåller giltig syntax FORCESEEK (MyIndex (a)) och FORCESEEK (MyIndex (a, b). Ogiltig syntax skulle innehålla FORCESEEK (MyIndex (c)) och FORCESEEK (MyIndex (a, c).
  • Ordningen på kolumnnamnen som anges i tipset måste matcha ordningen på kolumnerna i det refererade indexet.
  • Det går inte att ange kolumner som inte finns i indexnyckeldefinitionen. I ett icke-grupperat index kan till exempel endast de definierade indexnyckelkolumnerna anges. Klustrade nyckelkolumner som automatiskt ingår i indexet kan inte anges, men kan användas av optimeringen.
  • Det går inte att ange ett minnesoptimerad kolumnlagringsindex för xVelocity som indexparameter. Fel 366 returneras.
  • Att ändra indexdefinitionen (till exempel genom att lägga till eller ta bort kolumner) kan kräva ändringar i de frågor som refererar till indexet.
  • Tipset hindrar optimeraren från att överväga rumsliga index eller XML-index i tabellen.
  • Tipset kan inte anges i kombination med FORCESCAN tips.
  • För partitionerade index kan partitioneringskolumnen som implicit lagts till av SQL Server inte anges i FORCESEEK tips.

Försiktighet

Om du anger FORCESEEK med parametrar begränsas antalet planer som kan beaktas av optimeraren mer än när du anger FORCESEEK utan parametrar. Detta kan orsaka ett Plan cannot be generated fel i fler fall.

FORCESCAN

gäller för: SQL Server 2008 R2 (10.50.x) Service Pack 1 och senare versioner

Anger att frågeoptimeraren endast använder en indexgenomsökningsåtgärd som åtkomstsökväg till den refererade tabellen eller vyn. Det FORCESCAN tipset kan vara användbart för frågor där optimeraren underskattar antalet berörda rader och väljer en sökåtgärd i stället för en genomsökningsåtgärd. När detta inträffar är mängden minne som beviljas för åtgärden för litet och frågeprestanda påverkas.

FORCESCAN kan anges med eller utan ett INDEX tips. När den kombineras med ett indextips (INDEX = index_name, FORCESCAN) tar frågeoptimeraren endast hänsyn till sökvägar för genomsökning via det angivna indexet när den refererade tabellen används. FORCESCAN kan anges med indextipset INDEX(0) för att tvinga fram en tabellgenomsökningsåtgärd i bastabellen.

För partitionerade tabeller och index tillämpas FORCESCAN när partitioner har eliminerats genom utvärdering av frågepredikat. Det innebär att genomsökningen endast tillämpas på de återstående partitionerna och inte på hela tabellen.

Tipset FORCESCAN har följande begränsningar:

  • Tipset kan inte anges för en tabell som är målet för en INSERT, UPDATEeller DELETE-instruktion.
  • Tipset kan inte användas med fler än ett indextips.
  • Tipset hindrar frågeoptimeraren från att överväga spatiala index eller XML-index i tabellen.
  • Tipset kan inte anges för en fjärrdatakälla.
  • Tipset kan inte anges i kombination med FORCESEEK tips.

HOLDLOCK

Motsvarar SERIALIZABLE. Mer information finns i SERIALIZABLE senare i den här artikeln. HOLDLOCK gäller endast för den tabell eller vy som den har angetts för, och endast under transaktionens varaktighet som definieras av instruktionen som den används i. HOLDLOCK kan inte användas i en SELECT-instruktion som innehåller alternativet FOR BROWSE.

IGNORE_CONSTRAINTS

Gäller endast i en INSERT-instruktion när alternativet BULK används med OPENROWSET.

Anger att massimportåtgärden ignorerar eventuella begränsningar i tabellen. Som standard kontrollerar INSERTunika begränsningar och kontrollerar begränsningar och primära och sekundärnyckelbegränsningar. När IGNORE_CONSTRAINTS anges för en massimportåtgärd måste INSERT ignorera dessa begränsningar i en måltabell. Du kan inte inaktivera UNIQUE, PRIMARY KEYeller NOT NULL begränsningar.

Du kanske vill inaktivera CHECK och FOREIGN KEY begränsningar om indata innehåller rader som bryter mot begränsningar. Genom att inaktivera begränsningarna för CHECK och FOREIGN KEY kan du importera data och sedan använda Transact-SQL-instruktioner för att rensa data.

Men när CHECK och FOREIGN KEY begränsningar ignoreras markeras varje ignorerad begränsning i tabellen som is_not_trusted i sys.check_constraints- eller sys.foreign_keys katalogvyn efter åtgärden. Vid något tillfälle bör du kontrollera begränsningarna för hela tabellen. Om tabellen inte var tom före massimporten kan kostnaden för att återuppta begränsningen överskrida kostnaden för att tillämpa CHECK och FOREIGN KEY begränsningar för inkrementella data.

IGNORE_TRIGGERS

Gäller endast i en INSERT-instruktion när alternativet BULK används med OPENROWSET.

Anger att utlösare som definierats i tabellen ignoreras av massimportåtgärden. Som standard tillämpar INSERT utlösare.

Använd endast IGNORE_TRIGGERS om programmet inte är beroende av utlösare och det är viktigt att maximera prestanda.

NOLOCK

Motsvarar READUNCOMMITTED. Mer information finns i READUNCOMMITTED senare i den här artikeln.

Not

För UPDATE- eller DELETE-instruktioner: Den här funktionen tas bort i en framtida version av SQL Server. Undvik att använda den här funktionen i nytt utvecklingsarbete och planera att ändra program som för närvarande använder den här funktionen.

NOWAIT

Instruerar databasmotorn att returnera ett meddelande så snart ett lås påträffas i tabellen. NOWAIT motsvarar att ange SET LOCK_TIMEOUT 0 för en specifik tabell. Det NOWAIT tipset fungerar inte när TABLOCK tips också ingår. Om du vill avsluta en fråga utan att vänta när du använder tipset TABLOCK ska du i stället förorda frågan med SET LOCK_TIMEOUT 0;.

PAGLOCK

Tar sidlås antingen där enskilda lås vanligtvis tas på rader eller nycklar, eller där ett enda tabelllås normalt tas. Som standard använder det låsläge som är lämpligt för åtgärden. När det anges i transaktioner som körs på SNAPSHOT isoleringsnivå tas inte sidlås om inte PAGLOCK kombineras med andra tabelltips som kräver lås, till exempel UPDLOCK och HOLDLOCK.

READCOMMITTED

Anger att läsåtgärder följer reglerna för READ COMMITTED isoleringsnivå med hjälp av antingen låsning eller radversioner. Om databasalternativet READ_COMMITTED_SNAPSHOT är OFFhämtar databasmotorn delade lås när data läss och släpper dessa lås när läsåtgärden har slutförts. Om databasalternativet READ_COMMITTED_SNAPSHOT är ONhämtar databasmotorn inte lås och använder radversioner. Mer information om isoleringsnivåer finns i SET TRANSACTION ISOLATION LEVEL.

Not

För UPDATE- eller DELETE-instruktioner: Den här funktionen tas bort i en framtida version av SQL Server. Undvik att använda den här funktionen i nytt utvecklingsarbete och planera att ändra program som för närvarande använder den här funktionen.

READCOMMITTEDLOCK

Anger att läsåtgärderna följer reglerna för READ COMMITTED isoleringsnivå med hjälp av låsning. Databasmotorn hämtar delade lås när data läse och släpper dessa lås när läsåtgärden har slutförts, oavsett inställningen för alternativet READ_COMMITTED_SNAPSHOT databas. Mer information om isoleringsnivåer finns i SET TRANSACTION ISOLATION LEVEL. Det här tipset kan inte anges i måltabellen för en INSERT-instruktion. fel 4140 returneras.

READPAST

Anger att databasmotorn inte läser rader som är låsta av andra transaktioner. När READPAST anges hoppas lås på radnivå över, men lås på sidnivå hoppas inte över. Databasmotorn hoppar alltså förbi raderna i stället för att blockera den aktuella transaktionen tills låsen släpps. Anta till exempel att tabell T1 innehåller en enda heltalskolumn med värdena 1, 2, 3, 4, 5. Om transaktion A ändrar värdet 3 till 8 men ännu inte har checkats in ger SELECT * FROM T1 (READPAST) värden 1, 2, 4, 5. READPAST används främst för att minska låsningskonkurrationen när du implementerar en arbetskö som använder en SQL Server-tabell. En köläsare som använder READPAST hoppar över tidigare köposter som är låsta av andra transaktioner till nästa tillgängliga köpost, utan att behöva vänta tills de andra transaktionerna släpper sina lås.

READPAST kan anges för alla tabeller som refereras i en UPDATE- eller DELETE-instruktion, och alla tabeller som refereras i en FROM-sats. När det anges i en UPDATE-instruktion tillämpas READPAST endast när du läser data för att identifiera vilka poster som ska uppdateras, oavsett var i instruktionen den anges. READPAST kan inte anges för tabeller i INTO-satsen i en INSERT-instruktion. Uppdatera eller ta bort åtgärder som använder READPAST kan blockeras när du läser sekundärnycklar eller indexerade vyer, eller när du ändrar sekundära index.

READPAST kan bara anges i transaktioner som körs på READ COMMITTED eller REPEATABLE READ isoleringsnivåer. När det anges i transaktioner som körs på SNAPSHOT isoleringsnivå måste READPAST kombineras med andra tabelltips som kräver lås, till exempel UPDLOCK och HOLDLOCK.

Det går inte att ange READPAST tabelltips när alternativet READ_COMMITTED_SNAPSHOT databas är inställt på ON och något av följande villkor är sant:

  • Sessionens transaktionsisoleringsnivå är READ COMMITTED.
  • Det READCOMMITTED tabelltipset anges också i frågan.

Om du vill ange READPAST tips i dessa fall tar du bort READCOMMITTED tabelltipset om det finns och tar med READCOMMITTEDLOCK tabelltipset i frågan.

READUNCOMMITTED

Anger att felaktiga läsningar tillåts. Inga delade lås utfärdas för att förhindra att andra transaktioner ändrar data som läses av den aktuella transaktionen, och exklusiva lås som anges av andra transaktioner blockerar inte den aktuella transaktionen från att läsa låsta data. Att tillåta felaktiga läsningar kan orsaka högre samtidighet, men på bekostnad av att läsa dataändringar som sedan återställs av andra transaktioner. Detta kan generera fel för din transaktion, presentera användare med data som aldrig har checkats in eller få användarna att se poster två gånger (eller inte alls).

READUNCOMMITTED och NOLOCK tips gäller endast för datalås. Alla frågor, inklusive frågor med READUNCOMMITTED och NOLOCK tips, hämtar lås för Sch-S (schemastabilitet) under kompilering och körning. Därför blockeras frågor när en samtidig transaktion innehåller ett lås för Sch-M (schemaändring) i tabellen. En DDL-åtgärd (datadefinitionsspråk) hämtar till exempel ett Sch-M lås innan schemainformationen i tabellen ändras. Alla samtidiga frågor, inklusive frågor som körs med READUNCOMMITTED eller NOLOCK tips, blockeras när du försöker hämta ett Sch-S lås. Omvänt blockerar en fråga med ett Sch-S lås en samtidig transaktion som försöker hämta ett Sch-M lås.

READUNCOMMITTED och NOLOCK kan inte anges för tabeller som ändras av åtgärder för att infoga, uppdatera eller ta bort. SQL Server-frågeoptimeraren ignorerar READUNCOMMITTED och NOLOCK tips i FROM-satsen som gäller för måltabellen för en UPDATE- eller DELETE-instruktion.

Not

Stöd för användning av READUNCOMMITTED och NOLOCK tips i FROM-satsen som gäller för måltabellen för en UPDATE- eller DELETE-instruktion tas bort i en framtida version av SQL Server. Undvik att använda dessa tips i den här kontexten i nytt utvecklingsarbete och planera att ändra program som för närvarande använder dem.

Du kan minimera låsningskonkurrationen samtidigt som du skyddar transaktioner från felaktiga läsningar av ogenomförda dataändringar genom att använda något av följande alternativ:

  • READ COMMITTED isoleringsnivå med READ_COMMITTED_SNAPSHOT databasalternativet ON.
  • Den SNAPSHOT isoleringsnivån.

Mer information om isoleringsnivåer finns i SET TRANSACTION ISOLATION LEVEL.

Not

Om du får felmeddelandet 601 när READUNCOMMITTED har angetts löser du det som ett dödlägesfel (felmeddelandet 1205) och försöker sedan utföra instruktionen igen.

REPEATABLEREAD

Anger att en genomsökning utförs med samma låssemantik som en transaktion som körs på REPEATABLE READ isoleringsnivå. Mer information om isoleringsnivåer finns i SET TRANSACTION ISOLATION LEVEL.

ÅRTULL

Anger att radlås tas när sid- eller tabelllås vanligtvis tas. När det anges i transaktioner som körs på SNAPSHOT isoleringsnivå tas inte radlås om inte ROWLOCK kombineras med andra tabelltips som kräver lås, till exempel UPDLOCK och HOLDLOCK. ROWLOCK kan inte användas med en tabell som har ett grupperat kolumnlagringsindex. I följande exempel returneras fel 651 till programmet.

UPDATE [dbo].[FactResellerSalesXL_CCI] WITH (ROWLOCK)
    SET UnitPrice = 50
WHERE ProductKey = 150;

SERIALISERAS

Motsvarar HOLDLOCK. Gör delade lås mer restriktiva genom att hålla dem tills en transaktion har slutförts, i stället för att frigöra det delade låset så snart den obligatoriska tabellen eller datasidan inte längre behövs, oavsett om transaktionen har slutförts eller inte. Genomsökningen utförs med samma semantik som en transaktion som körs på SERIALIZABLE isoleringsnivå. Mer information om isoleringsnivåer finns i SET TRANSACTION ISOLATION LEVEL.

ÖGONBLICKSBILD

gäller för: SQL Server 2014 (12.x) och senare versioner

Den minnesoptimerade tabellen nås under SNAPSHOT isolering. SNAPSHOT kan endast användas med minnesoptimerade tabeller (inte med diskbaserade tabeller), enligt följande exempel. Mer information finns i Introduktion till Memory-Optimized-tabeller.

SELECT *
FROM dbo.Customers AS c WITH (SNAPSHOT)
     LEFT OUTER JOIN dbo.[Order History] AS oh
         ON c.customer_id = oh.customer_id;

SPATIAL_WINDOW_MAX_CELLS = <integer_value>

gäller för: SQL Server 2012 (11.x) och senare versioner

Anger det maximala antalet celler som ska användas för att tessellera ett geometri- eller geografiobjekt. <integer_value> är ett värde mellan 1 och 8192.

Med det här alternativet kan du finjustera körningstiden för frågor genom att justera kompromissen mellan körningstiden för primärt och sekundärt filter. Ett större tal minskar körningstiden för sekundärt filter, men ökar den primära körningsfiltertiden och ett mindre antal minskar körningstiden för primärt filter, men ökar körningen av sekundärt filter. För tätare rumsliga data bör ett högre tal ge snabbare körningstid genom att ge en bättre uppskattning med det primära filtret och minska körningstiden för sekundärt filter. För mer glesa data minskar ett lägre tal körningstiden för det primära filtret.

Det här alternativet fungerar för både manuella och automatiska rutnäts-tessellationer.

TABLOCK

Anger att det förvärvade låset tillämpas på tabellnivå. Vilken typ av lås som hämtas beror på vilken instruktion som körs. En SELECT-instruktion kan till exempel hämta ett delat lås. Genom att ange TABLOCKtillämpas det delade låset på hela tabellen i stället för på rad- eller sidnivå. Om HOLDLOCK också anges hålls tabelllåset kvar till slutet av transaktionen.

När du importerar data till en heap med hjälp av instruktionen INSERT INTO <target_table> SELECT <columns> FROM <source_table> kan du aktivera minimal loggning och optimal låsning för -instruktionen genom att ange TABLOCK tips för måltabellen. Dessutom måste databasens återställningsmodell anges till enkel eller massloggad. Tipset TABLOCK möjliggör även parallella infogningar till heaps eller klustrade kolumnlagringsindex. Mer information finns i INSERT-.

När den används med OPENROWSET massraderuppsättningsprovider för att importera data till en tabell, TABLOCK gör det möjligt för flera klienter att samtidigt läsa in data i måltabellen med optimerad loggning och låsning. Mer information finns i Krav för minimal loggning i massimport.

TABLOCKX

Anger att ett exklusivt lås tas i tabellen.

UPDLOCK

Anger att uppdateringslås ska tas och hållas kvar tills transaktionen har slutförts. UPDLOCK tar endast uppdateringslås för skrivskyddade åtgärder på radnivå eller sidnivå. Om UPDLOCK kombineras med TABLOCK, eller om ett lås på tabellnivå tas av någon annan anledning, tas ett exklusivt (X) lås i stället.

När UPDLOCK anges ignoreras tipsen på READCOMMITTED- och READCOMMITTEDLOCK isoleringsnivå. Om till exempel isoleringsnivån för sessionen är inställd på SERIALIZABLE och en fråga anger (UPDLOCK, READCOMMITTED), ignoreras READCOMMITTED tips och transaktionen körs med hjälp av SERIALIZABLE isoleringsnivå.

XLOCK

Anger att exklusiva lås ska tas och hållas kvar tills transaktionen har slutförts. Om de anges med ROWLOCK, PAGLOCKeller TABLOCKgäller de exklusiva låsen för lämplig kornighetsnivå.

Anmärkningar

Tabelltipsen ignoreras om tabellen inte nås av frågeplanen. Detta kan bero på att optimeraren väljer att inte komma åt tabellen alls, eller på att en indexerad vy används i stället. I det senare fallet kan åtkomst till en indexerad vy förhindras med hjälp av OPTION (EXPAND VIEWS) frågetips.

Alla låstips sprids till alla tabeller och vyer som används av frågeplanen, inklusive tabeller och vyer som refereras i en vy. Dessutom utför SQL Server motsvarande kontroller av låskonsekvens.

Lås tips ROWLOCK, UPDLOCKoch XLOCK som hämtar lås på radnivå kan placera lås på indexnycklar i stället för faktiska datarader. Om en tabell till exempel har ett icke-grupperat index, och en SELECT-instruktion med hjälp av ett låstips hanteras av ett täckande index, hämtas ett lås på indexnyckeln i det täckande indexet i stället för på dataraden i bastabellen.

Om en tabell innehåller beräknade kolumner som beräknas av uttryck eller funktioner som har åtkomst till kolumner i andra tabeller, används inte tabelltipsen i dessa tabeller och sprids inte. Till exempel anges ett NOLOCK tabelltips i en tabell i frågan. Den här tabellen har beräknade kolumner som beräknas av en kombination av uttryck och funktioner som kommer åt kolumner i en annan tabell. Tabellerna som refereras till av uttrycken och funktionerna använder inte NOLOCK tabelltips när de används.

SQL Server tillåter inte fler än en tabelltips från var och en av följande grupper för varje tabell i FROM-satsen:

  • Detaljerade tips: PAGLOCK, NOLOCK, READCOMMITTEDLOCK, ROWLOCK, TABLOCKeller TABLOCKX.
  • Tips på isoleringsnivå: HOLDLOCK, NOLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE.

Filtrerade indextips

Ett filtrerat index kan användas som ett tabelltips, men gör att frågeoptimeraren genererar fel 8622 om det inte täcker alla rader som frågan väljer. Följande är ett exempel på ett ogiltigt filtrerat indextips. Exemplet skapar det filtrerade indexet FIBillOfMaterialsWithComponentID och använder det sedan som ett indextips för en SELECT-instruktion. Det filtrerade indexpredikatet innehåller datarader för ComponentIDs 533, 324 och 753. Frågepredikatet innehåller även datarader för ComponentIDs 533, 324 och 753, men utökar resultatuppsättningen till att omfatta ComponentIDs 855 och 924, som inte finns i det filtrerade indexet. Därför kan frågeoptimeraren inte använda det filtrerade indextipset och genererar fel 8622. Mer information finns i Skapa filtrerade index.

IF EXISTS (SELECT name FROM sys.indexes
           WHERE name = N'FIBillOfMaterialsWithComponentID'
                 AND object_id = OBJECT_ID(N'Production.BillOfMaterials'))
    DROP INDEX FIBillOfMaterialsWithComponentID
        ON Production.BillOfMaterials;
GO

CREATE NONCLUSTERED INDEX [FIBillOfMaterialsWithComponentID]
    ON Production.BillOfMaterials(ComponentID, StartDate, EndDate)
    WHERE ComponentID IN (533, 324, 753);
GO

SELECT StartDate, ComponentID
FROM Production.BillOfMaterials
WITH (INDEX (FIBillOfMaterialsWithComponentID))
WHERE ComponentID IN (533, 324, 753, 855, 924);
GO

Frågeoptimeraren överväger inte ett indextips om SET-alternativen inte har de värden som krävs för filtrerade index. Mer information finns i CREATE INDEX.

Använda NOEXPAND

NOEXPAND gäller endast för indexerade vyer. En indexerad vy är en vy med ett unikt grupperat index som skapats på den. Om en fråga innehåller referenser till kolumner som finns både i en indexerad vy och bastabeller, och frågeoptimeraren fastställer att användning av den indexerade vyn är den bästa metoden för att köra frågan, använder frågeoptimeraren indexet i vyn. Den här funktionen kallas indexerad vy som matchar. Före SQL Server 2016 (13.x) med Service Pack 1 stöds automatisk användning av en indexerad vy av frågeoptimeraren endast i specifika utgåvor av SQL Server. I SQL Server 2016 (13.x) med Service Pack 1 och senare versioner stöder alla utgåvor automatisk användning av en indexerad vy. Azure SQL Database och Azure SQL Managed Instance stöder även automatisk användning av indexerade vyer utan att ange NOEXPAND tips.

Mer information finns i arkitekturguiden för frågebearbetning.

En lista över funktioner som stöds av versionerna av SQL Server i Windows finns i:

För att frågeoptimeraren ska kunna överväga indexerade vyer för matchning eller använda en indexerad vy som refereras till med tipset NOEXPAND måste följande SET alternativ anges till ON.

  • ANSI_NULLS
  • ANSI_PADDING
  • ANSI_WARNINGS
  • ARITHABORT 1
  • CONCAT_NULL_YIELDS_NULL
  • QUOTED_IDENTIFIER

1ARITHABORT anges implicit till ON när ANSI_WARNINGS är inställt på ON. Därför behöver du inte justera den här inställningen manuellt.

Dessutom måste alternativet NUMERIC_ROUNDABORT anges till OFF.

Om du vill tvinga frågeoptimeraren att använda ett index för en indexerad vy anger du alternativet NOEXPAND. Det här tipset kan endast användas om vyn också namnges i frågan. SQL Server ger inget tips för att tvinga en viss indexerad vy att användas i en fråga som inte namnger vyn direkt i FROM-satsen. Frågeoptimeraren överväger dock att använda indexerade vyer, även om de inte refereras direkt i frågan. SQL Server Database Engine skapar bara automatiskt statistik i en indexerad vy när en NOEXPAND tabelltips används. Om du utelämnar det här tipset kan det leda till körningsplanvarningar om saknade statistik som inte kan lösas genom att skapa statistik manuellt.

Under frågeoptimeringen använder databasmotorn visningsstatistik som skapades automatiskt eller manuellt när frågan refererar till vyn direkt och NOEXPAND tips används.

Använda ett tabelltips som ett frågetips

Tabelltips kan också anges som ett frågetips med hjälp av OPTION (TABLE HINT)-satsen. Vi rekommenderar att du bara använder ett tabelltips som ett frågetips i kontexten för en -planguide. För ad hoc-frågor anger du endast dessa tips som tabelltips. Mer information finns i Frågetips.

Behörigheter

Tipsen KEEPIDENTITY, IGNORE_CONSTRAINTSoch IGNORE_TRIGGERS kräver ALTER behörigheter i tabellen.

Exempel

A. Använd TABLOCK-tipset för att ange en låsningsmetod

I följande exempel anges att ett delat lås tas på tabellen Production.Product i databasen AdventureWorks2022 och hålls kvar till slutet av UPDATE-instruktionen.

UPDATE Production.Product WITH (TABLOCK)
    SET ListPrice = ListPrice * 1.10
WHERE ProductNumber LIKE 'BK-%';
GO

B. Använd FORCESEEK-tipset för att ange en indexsökningsåtgärd

I följande exempel används FORCESEEK tips utan att ange ett index för att tvinga frågeoptimeraren att utföra en indexsökningsåtgärd i tabellen Sales.SalesOrderDetail i databasen AdventureWorks2022.

SELECT *
FROM Sales.SalesOrderHeader AS h
     INNER JOIN Sales.SalesOrderDetail AS d WITH (FORCESEEK)
         ON h.SalesOrderID = d.SalesOrderID
WHERE h.TotalDue > 100
      AND (d.OrderQty > 5
           OR d.LineTotal < 1000.00);
GO

I följande exempel används FORCESEEK tips med ett index för att tvinga frågeoptimeraren att utföra en indexsökningsåtgärd i den angivna index- och indexkolumnen.

SELECT h.SalesOrderID,
       h.TotalDue,
       d.OrderQty
FROM Sales.SalesOrderHeader AS h
     INNER JOIN Sales.SalesOrderDetail AS d
         WITH (FORCESEEK (PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID (SalesOrderID)))
         ON h.SalesOrderID = d.SalesOrderID
WHERE h.TotalDue > 100
      AND (d.OrderQty > 5
           OR d.LineTotal < 1000.00);
GO

C. Använd FORCESCAN-tipset för att ange en indexgenomsökningsåtgärd

I följande exempel används FORCESCAN tips för att tvinga frågeoptimeraren att utföra en genomsökningsåtgärd i tabellen Sales.SalesOrderDetail i databasen AdventureWorks2022.

SELECT h.SalesOrderID,
       h.TotalDue,
       d.OrderQty
FROM Sales.SalesOrderHeader AS h
     INNER JOIN Sales.SalesOrderDetail AS d WITH (FORCESCAN)
         ON h.SalesOrderID = d.SalesOrderID
WHERE h.TotalDue > 100
      AND (d.OrderQty > 5
           OR d.LineTotal < 1000.00);