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
, SNAPSHOT
och 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ändaFORCESEEK
med ettINDEX
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åsteNOEXPAND
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ärFORCESEEK
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
,UPDATE
ellerDELETE
-instruktion. - Tipset kan inte anges i kombination med ett
INDEX
tips eller ett annatFORCESEEK
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
,b
ochc
innehåller giltig syntaxFORCESEEK (MyIndex (a))
ochFORCESEEK (MyIndex (a, b)
. Ogiltig syntax skulle innehållaFORCESEEK (MyIndex (c))
ochFORCESEEK (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
,UPDATE
ellerDELETE
-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 INSERT
unika 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 KEY
eller 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 OFF
hä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 ON
hä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å medREAD_COMMITTED_SNAPSHOT
databasalternativetON
. - 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 TABLOCK
tillä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
, PAGLOCK
eller TABLOCK
gä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
, UPDLOCK
och 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
,TABLOCK
ellerTABLOCKX
. - 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:
- Utgåvor och funktioner som stöds i SQL Server 2022
- Utgåvor och funktioner som stöds i SQL Server 2019
- Utgåvor och funktioner som stöds i SQL Server 2017
- Utgåvor och funktioner som stöds i SQL Server 2016
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_CONSTRAINTS
och 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);