Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Skapar ett relationsindex i en tabell eller vy. Kallas även för ett radlagringsindex eftersom det antingen är ett grupperat eller icke-grupperat B-trädindex. Du kan skapa ett radlagringsindex innan det finns data i tabellen. Använd ett radlagringsindex för att förbättra frågeprestanda, särskilt när frågorna väljer från specifika kolumner eller kräver att värden sorteras i en viss ordning.
Not
I dokumentationen används termen B-träd vanligtvis som referens till index. I radlagringsindex implementerar databasmotorn ett B+-träd. Detta gäller inte för kolumnlagringsindex eller index i minnesoptimerade tabeller. Mer information finns i arkitekturen och designguiden för SQL Server och Azure SQL-index.
Azure Synapse Analytics and Analytics Platform System (PDW) stöder för närvarande inte unika begränsningar. Exempel som refererar till unika begränsningar gäller endast för SQL Server, Azure SQL Database och Azure SQL Managed Instance.
Information om riktlinjer för indexdesign finns i designguiden för SQL Server-index.
exempel:
Skapa ett icke-grupperat index i en tabell eller vy
CREATE INDEX index1 ON schema1.table1 (column1);
Skapa ett klustrat index i en tabell och använd ett 3-delsnamn för tabellen
CREATE CLUSTERED INDEX index1 ON database1.schema1.table1 (column1);
Skapa ett icke-grupperat index med en unik begränsning och ange sorteringsordningen
CREATE UNIQUE INDEX index1 ON schema1.table1 (column1 DESC, column2 ASC, column3 DESC);
Nyckelscenario:
Från och med SQL Server 2016 (13.x), i Azure SQL Database och i Azure SQL Managed Instance kan du använda ett icke-grupperat index på ett kolumnlagringsindex för att förbättra frågeprestanda för datalager. Mer information finns i Columnstore-index – informationslager.
Ytterligare typer av index finns i:
Transact-SQL syntaxkonventioner
Syntax
Syntax för SQL Server, Azure SQL Database, Azure SQL Managed Instance
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON <object> ( column [ ASC | DESC ] [ ,...n ] )
[ INCLUDE ( column_name [ ,...n ] ) ]
[ WHERE <filter_predicate> ]
[ WITH ( <relational_index_option> [ ,...n ] ) ]
[ ON { partition_scheme_name ( column_name )
| filegroup_name
| default
}
]
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
[ ; ]
<object> ::=
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
<relational_index_option> ::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| SORT_IN_TEMPDB = { ON | OFF }
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| STATISTICS_INCREMENTAL = { ON | OFF }
| DROP_EXISTING = { ON | OFF }
| ONLINE = { ON [ ( <low_priority_lock_wait> ) ] | OFF }
| RESUMABLE = { ON | OFF }
| MAX_DURATION = <time> [MINUTES]
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
| MAXDOP = max_degree_of_parallelism
| DATA_COMPRESSION = { NONE | ROW | PAGE }
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ , ...n ] ) ]
| XML_COMPRESSION = { ON | OFF }
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ , ...n ] ) ]
}
<filter_predicate> ::=
<conjunct> [ AND ] [ ...n ]
<conjunct> ::=
<disjunct> | <comparison>
<disjunct> ::=
column_name IN (constant ,...n)
<comparison> ::=
column_name <comparison_op> constant
<comparison_op> ::=
{ IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< }
<low_priority_lock_wait>::=
{
WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ] ,
ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )
}
<range> ::=
<partition_number_expression> TO <partition_number_expression>
Bakåtkompatibelt relationsindex
Viktig
Den bakåtkompatibla syntaxstrukturen för relationsindex tas bort i en framtida version av SQL Server. Undvik att använda den här syntaxstrukturen i det nya utvecklingsarbetet och planera att ändra program som för närvarande använder funktionen. Använd syntaxstrukturen som anges i <relational_index_option> i stället.
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON <object> ( column_name [ ASC | DESC ] [ ,...n ] )
[ WITH <backward_compatible_index_option> [ ,...n ] ]
[ ON { filegroup_name | "default" } ]
<object> ::=
{
[ database_name. [ owner_name ] . | owner_name. ]
table_or_view_name
}
<backward_compatible_index_option> ::=
{
PAD_INDEX
| FILLFACTOR = fillfactor
| SORT_IN_TEMPDB
| IGNORE_DUP_KEY
| STATISTICS_NORECOMPUTE
| DROP_EXISTING
}
Syntax för Azure Synapse Analytics och Parallel Data Warehouse
CREATE CLUSTERED COLUMNSTORE INDEX index_name
ON [ database_name . [ schema ] . | schema . ] table_name
[ORDER (column[,...n])]
[WITH ( DROP_EXISTING = { ON | OFF } )]
[;]
CREATE [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON [ database_name . [ schema ] . | schema . ] table_name
( { column [ ASC | DESC ] } [ ,...n ] )
WITH ( DROP_EXISTING = { ON | OFF } )
[;]
Argument
UNIK
Skapar ett unikt index i en tabell eller vy. Ett unikt index är ett där inga två rader tillåts ha samma indexnyckelvärde.
Databasmotorn tillåter inte att du skapar ett unikt index för kolumner som redan innehåller dubblettvärden, oavsett om IGNORE_DUP_KEY
det är inställt ON
på . Om detta görs visar databasmotorn ett felmeddelande. Dubblettvärden måste tas bort innan ett unikt index kan skapas i kolumnen eller kolumnerna.
En UNIQUE
begränsning behandlas NULL
som ett värde. Om en kolumn är nullbar och det finns en UNIQUE
begränsning i kolumnen tillåts högst en rad med en NULL
.
KLUSTRADE
Skapar ett index där den sorteringsordning som angetts för indexnyckelkolumnerna avgör sidordningen i indexstrukturen på disken. Rader på sidorna längst ned eller på lövnivån för det klustrade indexet innehåller alltid alla kolumner i tabellen. Rader på sidorna i indexets övre nivåer innehåller endast nyckelkolumner.
En tabell kan bara ha ett grupperat index. Om det finns ett grupperat index i en tabell innehåller det alla data i tabellen. En tabell utan ett klustrat index kallas för en heap.
En vy med ett unikt grupperat index kallas för en indexerad vy. En indexerad vy kan bara ha ett grupperat index. När du skapar ett unikt grupperat index i en vy materialiseras vyn fysiskt. Ett unikt grupperat index måste skapas i en vy innan andra index kan definieras i samma vy. Mer information finns i Skapa indexerade vyer.
Skapa det klustrade indexet innan du skapar några icke-grupperade index. Befintliga icke-grupperade index i tabeller återskapas när ett klustrat index skapas, vilket är en resursintensiv åtgärd om tabellen är stor.
Om CLUSTERED
inte anges skapas ett icke-grupperat index.
Not
Eftersom det klustrade indexet innehåller alla data i tabellen flyttas tabellen från den filgrupp där tabellen skapades till det nya partitionsschemat eller filgruppen genom att skapa ett grupperat index och använda -instruktionen eller med hjälp av ON partition_scheme_name
-instruktionen ON filegroup_name
. Innan du skapar tabeller eller index för specifika filgrupper kontrollerar du vilka filgrupper som är tillgängliga och att de har tillräckligt med tomt utrymme för indexet.
I vissa fall kan du aktivera tidigare inaktiverade index genom att skapa ett grupperat index. Mer information finns i Aktivera index och begränsningar och Inaktivera index och begränsningar.
NONCLUSTERED
Skapar ett index där den sorteringsordning som angetts för indexnyckelkolumnerna avgör sidordningen i indexstrukturen på disken. Till skillnad från det klustrade indexet innehåller rader på sidorna på lövnivån för ett icke-grupperat index endast indexnyckelkolumnerna. Du kan också inkludera en delmängd av icke-nyckelkolumner med hjälp av INCLUDE
-satsen.
Varje tabell kan ha upp till 999 icke-illustrerade index, oavsett hur indexen skapas: antingen implicit med PRIMARY KEY
begränsningarna och UNIQUE
eller explicit med CREATE INDEX
.
För indexerade vyer kan icke-grupperade index endast skapas i en vy som har ett unikt grupperat index som redan har definierats.
Om inget annat anges är standardindextypen inte illustrerad.
index_name
Namnet på indexet. Indexnamn måste vara unika i en tabell eller vy, men behöver inte vara unika i en databas. Indexnamn måste följa reglerna för identifierare.
kolumn
Kolumnen eller kolumnerna som indexet baseras på. Ange två eller flera kolumnnamn för att skapa ett sammansatt index för de kombinerade värdena i de angivna kolumnerna. Visa en lista över de kolumner som ska ingå i det sammansatta indexet, i sorteringsprioritetsordning, inom parenteserna efter table_or_view_name.
Upp till 32 kolumner kan kombineras till en enda sammansatt indexnyckel. Alla kolumner i en sammansatt indexnyckel måste finnas i samma tabell eller vy. Den maximala tillåtna storleken för de kombinerade indexvärdena är 900 byte för ett grupperat index, eller 1 700 för ett icke-grupperat index. Gränserna är 16 kolumner och 900 byte för versioner före SQL Database och SQL Server 2016 (13.x).
Kolumner som är av de stora objektdatatyperna (LOB) ntext, text, varchar(max), nvarchar(max), varbinary(max), xmleller bild inte kan anges som nyckelkolumner för ett index. Dessutom kan en indexerad vydefinition inte innehålla ntext-, text- eller bildkolumner , även om de inte refereras till i -instruktionen CREATE INDEX
.
Du kan skapa index för CLR-användardefinierade typkolumner om typen stöder binär ordning. Du kan också skapa index för beräknade kolumner som definieras som metodanrop från en användardefinierad typkolumn, så länge metoderna är markerade som deterministiska och inte utför dataåtkomståtgärder. Mer information om hur du indexerar CLR-användardefinierade typkolumner finns i CLR-användardefinierade typer.
[ ASC | DESC ]
Avgör stigande eller fallande sorteringsriktning för den specifika indexkolumnen. Standardvärdet är ASC
.
INCLUDE (column [ ,... n ] )
Anger de icke-nyckelkolumner som ska läggas till på lövnivån för ett icke-grupperat index. Det icke-illustrerade indexet kan vara unikt eller icke-unikt.
Kolumnnamn kan inte upprepas i INCLUDE
listan och kan inte användas samtidigt som både nyckelkolumner och icke-nyckelkolumner. Icke-grupperade index innehåller alltid implicit de klustrade indexkolumnerna om ett klustrat index definieras i tabellen. Mer information finns i Skapa index med inkluderade kolumner.
Alla datatyper tillåts förutom text, ntextoch bild. Från och med SQL Server 2012 (11.x), i Azure SQL Database och i Azure SQL Managed Instance, om någon av de angivna icke-nyckelkolumnerna är varchar(max), nvarchar(max)eller varbinary(max) datatyper, kan indexet skapas eller återskapas med hjälp av ONLINE
alternativet .
Beräknade kolumner som är deterministiska och antingen exakta eller oprecisa kan inkluderas kolumner. Beräknade kolumner som härleds från datatyperna image, ntext, text, varchar(max), nvarchar(max), varbinary(max) och xml kan inkluderas så länge datatypen för den beräknade kolumnen är tillåten som en inkluderad kolumn. Mer information finns i Index över beräknade kolumner.
Information om hur du skapar ett XML-index finns i CREATE XML INDEX.
VAR <filter_predicate>
Skapar ett filtrerat index genom att ange vilka rader som ska inkluderas i indexet. Det filtrerade indexet måste vara ett icke-grupperat index i en tabell. Skapar filtrerad statistik för dataraderna i det filtrerade indexet.
Filterpredikatet använder enkel jämförelselogik och kan inte referera till en beräknad kolumn, en användardefinierad datatypkolumn (UDT), en kolumn för rumslig datatyp eller en hierarkiiddatatypkolumn . Jämförelser med NULL
literaler med hjälp av jämförelseoperatorerna tillåts inte. Använd operatorerna IS NULL
och IS NOT NULL
i stället.
Här följer några exempel på filterpredikat för tabellen Production.BillOfMaterials
:
WHERE StartDate > '20000101' AND EndDate <= '20000630'
WHERE ComponentID IN (533, 324, 753)
WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL
Filtrerade index gäller inte för XML-index och fulltextindex. För UNIQUE
index måste endast de markerade raderna ha unika indexvärden. Filtrerade index tillåter inte alternativet IGNORE_DUP_KEY
.
PÅ partition_scheme_name ( column_name )
Anger partitionsschemat som definierar de filgrupper som partitionerna i ett partitionerat index mappas till. Partitionsschemat måste finnas i databasen genom att antingen köra CREATE PARTITION SCHEME eller ALTER PARTITION SCHEME. column_name anger partitioneringskolumnen för indexet. Den här kolumnen måste matcha datatypen, längden och precisionen för argumentet för partitionsfunktionen som partition_scheme_name använder. column_name är inte begränsat till kolumnerna i indexdefinitionen. Alla kolumner i bastabellen kan anges, förutom när du partitionerar ett unikt index , column_name måste väljas bland dem som används som unik nyckel. Med den här begränsningen kan databasmotorn endast verifiera att nyckelvärdena är unika inom en enda partition.
Not
När du partitionerar ett icke-unikt grupperat index lägger databasmotorn som standard till partitioneringskolumnen i listan över klustrade indexnycklar, om den inte redan har angetts. När du partitionerar ett icke-unikt, icke-grupperat index lägger databasmotorn till partitioneringskolumnen som en icke-nyckelkolumn (ingår) i indexet, om den inte redan har angetts.
Om partition_scheme_name eller filgrupp inte anges och tabellen partitioneras placeras indexet i samma partitionsschema med samma partitioneringskolumn som den underliggande tabellen.
Not
Du kan inte ange ett partitioneringsschema för ett XML-index. Om bastabellen är partitionerad använder XML-indexet samma partitionsschema som tabellen.
Mer information om partitionering av index, partitionerade tabeller och index.
PÅ filegroup_name
Skapar det angivna indexet för den angivna filgruppen. Om ingen plats har angetts och tabellen eller vyn inte är partitionerad använder indexet samma filgrupp som den underliggande tabellen eller vyn. Filgruppen måste redan finnas.
PÅ [standard]
Skapar det angivna indexet för samma filgrupps- eller partitionsschema som tabellen eller vyn.
Termen default
, i den här kontexten, är inte ett nyckelord. Det är en identifierare för filgruppen eller partitionerat schema i tabellen eller vyn och måste avgränsas, som i ON "default"
eller ON [default]
. Om "default"
anges måste alternativet QUOTED_IDENTIFIER
vara ON
för den aktuella sessionen. Det här är standardinställningen. Mer information finns i SET QUOTED_IDENTIFIER.
Not
I kontexten CREATE INDEX
för , "default"
och [default]
ange inte databasens standardfilgrupp. De anger det filgrupps- eller partitionsschema som används av bastabellen eller vyn. Detta skiljer sig från CREATE TABLE
, där "default"
och [default]
placerar tabellen i databasens standardfilgrupp.
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
Anger placeringen av FILESTREAM-data för tabellen när ett klustrat index skapas. Med FILESTREAM_ON
-satsen kan FILESTREAM-data flyttas till ett annat FILESTREAM-filgrupps- eller partitionsschema.
Filestream_filegroup_name är namnet på en FILESTREAM-filgrupp. Filgruppen måste ha en fil definierad för filgruppen med hjälp av en CREATE DATABASE eller ALTER DATABASE-instruktion. annars utlöses ett fel.
Om tabellen är partitionerad måste FILESTREAM_ON
-satsen inkluderas och måste ange ett partitionsschema med FILESTREAM-filgrupper som använder samma partitionsfunktion och partitionskolumner som partitionsschemat för tabellen. Annars utlöses ett fel.
Om tabellen inte är partitionerad kan kolumnen FILESTREAM inte partitioneras. FILESTREAM-data för tabellen måste lagras i en enda filgrupp som anges i FILESTREAM_ON
-satsen.
FILESTREAM_ON NULL
kan anges i en CREATE INDEX
-instruktion om ett klustrat index skapas och tabellen inte innehåller någon FILESTREAM-kolumn.
Mer information finns i FILESTREAM (SQL Server).
<objekt>::=
Det fullständigt kvalificerade eller icke-kvalificerade objekt som ska indexeras.
database_name
Namnet på databasen.
schema_name
Namnet på schemat som tabellen eller vyn tillhör.
table_or_view_name
Namnet på tabellen eller vyn som ska indexeras.
Om du vill skapa ett index i en vy måste vyn definieras med SCHEMABINDING
. Ett unikt grupperat index måste skapas i en vy innan ett icke-grupperat index skapas. Mer information om indexerade vyer finns i Kommentarer.
Från och med SQL Server 2016 (13.x) kan objektet vara en tabell som lagras med ett grupperat columnstore-index.
Azure SQL Database stöder namnformatet i tre delar <database_name>.<schema_name>.<object_name>
när <database_name>
är det aktuella databasnamnet eller <database_name>
är tempdb
och <object_name>
börjar med #
eller ##
. Om schemanamnet är dbo
kan <schema_name>
utelämnas.
<relational_index_option>::=
Anger vilka alternativ som ska användas när du skapar indexet.
PAD_INDEX = { ON | AV }
Anger indexutfyllnad. Standardvärdet är OFF
.
PÅ
Procentandelen ledigt utrymme som anges av fyllningsfaktorn tillämpas på sidorna på mellannivå i indexet. Om
FILLFACTOR
inte anges samtidigtPAD_INDEX
anges tillON
används fyllningsfaktorvärdet i sys.indexes.BORT
Sidorna på mellannivå fylls till nära kapacitet, vilket ger tillräckligt med utrymme för minst en rad av den maximala storlek som indexet kan ha, med tanke på uppsättningen nycklar på mellanliggande sidor. Detta inträffar också om
PAD_INDEX
är inställt påON
men fyllningsfaktorn inte har angetts.
Alternativet PAD_INDEX
är bara användbart när FILLFACTOR
anges, eftersom PAD_INDEX
använder den procentandel som anges av FILLFACTOR
. Om procentandelen som angetts för FILLFACTOR
inte är tillräckligt stor för att tillåta en rad åsidosätter databasmotorn internt procentandelen för att tillåta ett minimum. Antalet rader på en mellanliggande indexsida är aldrig mindre än två, oavsett hur lågt värdet FILLFACTOR
för .
I bakåtkompatibel syntax motsvarar WITH PAD_INDEX
WITH PAD_INDEX = ON
.
FILLFACTOR = fillfactor
Anger en procentandel som anger hur full databasmotorn ska göra lövnivån för varje indexsida när index skapas eller återskapas. Fillfactor-värdet måste vara ett heltalsvärde från 1 till 100. Fyllningsfaktorvärdena 0 och 100 är desamma i alla avseenden. Om fillfactor- är 100 skapar databasmotorn index med lövsidor fyllda till kapacitet.
Inställningen FILLFACTOR
gäller endast när indexet skapas eller återskapas. Databasmotorn behåller inte dynamiskt den angivna procentandelen tomt utrymme på sidorna.
Om du vill visa fyllningsfaktorinställningen fill_factor
använder du kolumnen i katalogvyn sys.indexes .
Viktig
Om du skapar ett index med en FILLFACTOR
mindre än 100 ökar mängden lagringsutrymme som data upptar eftersom databasmotorn omdistribuerar data enligt fyllningsfaktorn när det skapar eller återskapar ett index.
Mer information finns i Ange fyllningsfaktor för ett index.
SORT_IN_TEMPDB = { ON | AV }
Anger om tillfälliga sorteringsresultat ska lagras i tempdb
. Standardvärdet är OFF
förutom Azure SQL Database Hyperscale. För alla index build-åtgärder i Hyperskala är SORT_IN_TEMPDB
alltid ON
om inte en återanvändbar indexversion används. För återupptabara indexversioner är SORT_IN_TEMPDB
alltid OFF
.
PÅ
Mellanliggande sorteringsresultat som används för att skapa indexet lagras i
tempdb
. Detta kan minska den tid som krävs för att skapa ett index. Detta ökar dock mängden diskutrymme som används under indexversionen.BORT
Mellanliggande sorteringsresultat lagras i samma databas som indexet.
Förutom det utrymme som krävs i användardatabasen för att skapa indexet tempdb
måste det ha ungefär samma mängd extra utrymme för att lagra mellanliggande sorteringsresultat. Mer information finns i SORT_IN_TEMPDB alternativet för index.
I bakåtkompatibel syntax motsvarar WITH SORT_IN_TEMPDB
WITH SORT_IN_TEMPDB = ON
.
IGNORE_DUP_KEY = { ON | AV }
Anger felsvaret när en infogningsåtgärd försöker infoga dubblettnyckelvärden i ett unikt index. Alternativet IGNORE_DUP_KEY
gäller endast för infogningsåtgärder när indexet har skapats eller återskapats. Alternativet har ingen effekt när du kör CREATE INDEX, ALTER INDEXeller UPDATE. Standardvärdet är OFF
.
PÅ
Ett varningsmeddelande inträffar när dubbletter av nyckelvärden infogas i ett unikt index. Endast de rader som bryter mot unikhetsbegränsningen infogas inte.
BORT
Ett felmeddelande uppstår när dubbletter av nyckelvärden infogas i ett unikt index. Hela
INSERT
instruktionen återställs.
IGNORE_DUP_KEY
kan inte anges till ON
för index som skapats i en vy, icke-unika index, XML-index, rumsliga index och filtrerade index.
Om du vill visa inställningen IGNORE_DUP_KEY
för ett index använder du kolumnen ignore_dup_key
i sys.indexes katalogvy.
I bakåtkompatibel syntax motsvarar WITH IGNORE_DUP_KEY
WITH IGNORE_DUP_KEY = ON
.
STATISTICS_NORECOMPUTE = { ON | OFF}
Anger om statistik omberäknas. Standardvärdet är OFF
.
PÅ
Inaktuell statistik omberäknas inte automatiskt.
BORT
Automatisk uppdatering av statistik är aktiverade.
Om du vill återställa automatisk uppdatering av statistik ställer du in STATISTICS_NORECOMPUTE
på AV eller kör UPDATE STATISTICS
utan NORECOMPUTE
-satsen.
Varning
Om du inaktiverar automatisk omberäkning av statistik genom att ange STATISTICS_NORECOMPUTE = ON
kan du förhindra att frågeoptimeraren väljer optimala körningsplaner för frågor som involverar tabellen.
Om du anger STATISTICS_NORECOMPUTE
till ON
hindrar inte uppdateringen av indexstatistiken som inträffar under indexet återskapandeåtgärden.
I bakåtkompatibel syntax motsvarar WITH STATISTICS_NORECOMPUTE
WITH STATISTICS_NORECOMPUTE = ON
.
STATISTICS_INCREMENTAL = { ON | AV }
gäller för: SQL Server 2014 (12.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance
När ON
är den statistik som skapas per partitionsstatistik. När OFF
tas statistikträdet bort och SQL Server beräknar statistiken igen. Standardvärdet är OFF
.
Om statistik per partition inte stöds ignoreras alternativet och en varning genereras. Inkrementell statistik stöds inte i följande fall:
- Statistik som skapats med index som inte är partitionsjusterade med bastabellen.
- Statistik som skapats på skrivbara sekundära databaser med AlwaysOn.
- Statistik som skapats på skrivskyddade databaser.
- Statistik som skapats för filtrerade index.
- Statistik som skapats för vyer.
- Statistik som skapats i interna tabeller.
- Statistik som skapats med rumsliga index eller XML-index.
DROP_EXISTING = { ON | AV }
Är ett alternativ för att släppa och återskapa det befintliga klustrade eller icke-grupperade indexet med ändrade kolumnspecifikationer och behålla samma namn för indexet. Standardvärdet är OFF
.
PÅ
Anger för att släppa och återskapa det befintliga indexet, som måste ha samma namn som parametern index_name.
BORT
Anger att det befintliga indexet inte ska släppas och återskapas. SQL Server visar ett fel om det angivna indexnamnet redan finns.
Med DROP_EXISTING
kan du ändra:
- Ett icke-grupperat radlagringsindex till ett grupperat radlagringsindex.
Med DROP_EXISTING
kan du inte ändra:
- Ett grupperat radlagringsindex till ett icke-grupperat radlagringsindex.
- Ett grupperat columnstore-index till alla typer av radlagringsindex.
I bakåtkompatibel syntax motsvarar WITH DROP_EXISTING
WITH DROP_EXISTING = ON
.
ONLINE = { ON | AV }
Anger om underliggande tabeller och associerade index är tillgängliga för frågor och dataändringar under indexåtgärden. Standardvärdet är OFF
.
Viktig
Onlineindexåtgärder är inte tillgängliga i varje utgåva av Microsoft SQL Server. En lista över funktioner som stöds av versionerna av SQL Server finns i Utgåvor och funktioner som stöds i SQL Server 2022.
PÅ
Långsiktiga tabelllås hålls inte under indexåtgärdens varaktighet. Under huvudfasen av indexåtgärden lagras endast ett delat avsiktslås (
IS
) i källtabellen. Detta gör att frågor eller uppdateringar av den underliggande tabellen och index kan fortsätta. I början av åtgärden hålls ett delat (S
) lås på källobjektet under en kort tidsperiod. I slutet av åtgärden, under en kort tidsperiod, hämtas ett delat (S
) lås på objektet om ett icke-grupperat index skapas. Ett schemaändringslås (Sch-M
) hämtas när ett klustrat index skapas eller tas bort online och när ett klustrat eller icke-grupperat index återskapas.ONLINE
kan inte anges tillON
när ett index skapas i en lokal tillfällig tabell.Not
Du kan använda alternativet
WAIT_AT_LOW_PRIORITY
för att minska eller undvika blockering under onlineindexåtgärder. Mer information finns i WAIT_AT_LOW_PRIORITY med onlineindexåtgärder.BORT
Tabelllås tillämpas under indexåtgärdens varaktighet. En offlineindexåtgärd som skapar, återskapar eller släpper ett klustrat, rumsligt index eller XML-index, eller återskapar eller släpper ett icke-grupperat index, hämtar ett schemaändringslås (
Sch-M
) i tabellen. Detta förhindrar all användaråtkomst till den underliggande tabellen under hela åtgärden. En offlineindexåtgärd som skapar ett icke-grupperat index hämtar ursprungligen ett delat lås (S
) i tabellen. Detta förhindrar ändringar av den underliggande tabelldefinitionen, men tillåter läsning och ändring av data i tabellen medan indexet byggs.
Mer information finns i Utföra indexåtgärder online och riktlinjer för onlineindexåtgärder.
Index, inklusive index i globala temporära tabeller, kan skapas online förutom i följande fall:
- XML-index
- Index i en lokal temporär tabell
- Första unika klustrade index i en vy
- Inaktiverade klustrade index
- Grupperade columnstore-index i SQL Server 2017 (14.x)) och äldre versioner
- Icke-illustrerade kolumnlagringsindex i SQL Server 2016 (13.x)) och äldre versioner
- Grupperat index, om den underliggande tabellen innehåller LOB-datatyper (bild, ntext, text) och rumsliga datatyper
-
varchar(max) och varbinary(max) kolumner kan inte ingå i en indexnyckel. I SQL Server (från och med SQL Server 2012 (11.x)), i Azure SQL Database och i Azure SQL Managed Instance, när en tabell innehåller kolumner med varchar(max) eller varbinary(max), kan ett klustrat index som innehåller andra kolumner byggas eller återskapas med hjälp av
ONLINE
alternativet . - Icke-grupperade index i en tabell med ett grupperat columnstore-index
Mer information finns i Hur onlineindexåtgärder fungerar.
RESUMABLE = { ON | AV }
gäller för: SQL Server 2019 (15.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance
Anger om en onlineindexåtgärd kan återupptas. Mer information finns i Återupptabara indexåtgärder och Överväganden för återanvändbara index.
PÅ
Indexåtgärden kan återupptas.
BORT
Indexåtgärden kan inte återupptas.
MAX_DURATION = tid [MINUTER] som används med RESUMABLE = ON
(kräver ONLINE = ON
)
gäller för: SQL Server 2019 (15.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance
Anger hur länge, i minuter, en återupptabar indexåtgärd körs innan den pausas.
ALLOW_ROW_LOCKS = { ON | AV }
Anger om radlås tillåts. Standardvärdet är ON
.
PÅ
Radlås tillåts vid åtkomst till indexet. Databasmotorn avgör när radlås används.
BORT
Radlås används inte.
ALLOW_PAGE_LOCKS = { ON | AV }
Anger om sidlås tillåts. Standardvärdet är ON
.
PÅ
Sidlås tillåts vid åtkomst till indexet. Databasmotorn avgör när sidlås används.
BORT
Sidlås används inte.
OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | AV }
gäller för: SQL Server 2019 (15.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance
Anger om du vill optimera för att undvika infogningskonkurnation på sista sidan. Standardvärdet är OFF
. Mer information finns i avsnittet Sekventiella nycklar .
MAXDOP = max_degree_of_parallelism
Åsidosätter maximal grad av parallellitet konfigurationsalternativ för indexåtgärden. Mer information finns i Konfigurera den maximala graden av parallellitet serverkonfigurationsalternativ. Använd MAXDOP
för att begränsa graden av parallellitet och den resulterande resursförbrukningen för en indexgenereringsåtgärd.
max_degree_of_parallelism kan vara:
1
Undertrycker parallell plangenerering.
>1
Begränsar den maximala grad av parallellitet som används i en parallell indexåtgärd till det angivna talet eller mindre baserat på den aktuella systemarbetsbelastningen.
0 (standard)
Använder den grad av parallellitet som anges på server-, databas- eller arbetsbelastningsgruppsnivå, såvida den inte minskas baserat på den aktuella systemarbetsbelastningen.
Mer information finns i Konfigurera parallella indexåtgärder.
Not
Parallella indexåtgärder är inte tillgängliga i varje utgåva av Microsoft SQL Server. En lista över funktioner som stöds av versionerna av SQL Server finns i Utgåvor och funktioner som stöds i SQL Server 2022.
DATA_COMPRESSION
Anger datakomprimeringsalternativet för det angivna indexet, partitionsnumret eller partitionsintervallet. Alternativen är följande:
INGEN
Index eller angivna partitioner komprimeras inte. Detta gäller inte för kolumnlagringsindex.
RAD
Index eller angivna partitioner komprimeras med hjälp av radkomprimering. Detta gäller inte för kolumnlagringsindex.
SIDA
Index eller angivna partitioner komprimeras med hjälp av sidkomprimering. Detta gäller inte för kolumnlagringsindex.
COLUMNSTORE
gäller för: SQL Server 2014 (12.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance
Gäller endast för columnstore-index, inklusive både icke-grupperade kolumnarkiv och grupperade kolumnlagringsindex.
COLUMNSTORE_ARCHIVE
gäller för: SQL Server 2014 (12.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance
Gäller endast för columnstore-index, inklusive både icke-grupperade kolumnarkiv och grupperade kolumnlagringsindex.
COLUMNSTORE_ARCHIVE
komprimerar den angivna partitionen ytterligare till en mindre storlek. Detta kan användas för arkivering, eller för andra situationer som kräver en mindre lagringsstorlek och har råd med mer tid för lagring och hämtning.
Mer information om komprimering finns i Datakomprimering.
XML_COMPRESSION
gäller för: SQL Server 2022 (16.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance
Anger XML-komprimeringsalternativet för det angivna indexet som innehåller en eller flera xml- datatypskolumner. Alternativen är följande:
PÅ
Index eller angivna partitioner komprimeras med hjälp av XML-komprimering.
BORT
Index eller angivna partitioner komprimeras inte med XML-komprimering.
PÅ PARTITIONER ( { <partition_number_expression> | <intervall> } [ ,...n ] )
Anger de partitioner som inställningarna för DATA_COMPRESSION
eller XML_COMPRESSION
gäller för. Om indexet inte är partitionerat genererar argumentet ON PARTITIONS
ett fel. Om ON PARTITIONS
-satsen inte tillhandahålls gäller alternativet DATA_COMPRESSION
eller XML_COMPRESSION
för alla partitioner i ett partitionerat index.
<partition_number_expression>
kan anges på följande sätt:
- Ange numret för en partition, till exempel:
ON PARTITIONS (2)
. - Ange partitionsnumren för flera enskilda partitioner avgränsade med kommatecken, till exempel:
ON PARTITIONS (1, 5)
. - Ange både intervall och enskilda partitioner, till exempel:
ON PARTITIONS (2, 4, 6 TO 8)
.
<range>
kan anges som partitionsnummer avgränsade med nyckelordet TO
, till exempel: ON PARTITIONS (6 TO 8)
.
Om du vill ange olika typer av datakomprimering för olika partitioner anger du alternativet DATA_COMPRESSION
mer än en gång, till exempel:
REBUILD WITH
(
DATA_COMPRESSION = NONE ON PARTITIONS (1),
DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8),
DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
);
Du kan också ange alternativet XML_COMPRESSION
mer än en gång, till exempel:
REBUILD WITH
(
XML_COMPRESSION = OFF ON PARTITIONS (1),
XML_COMPRESSION = ON ON PARTITIONS (2, 4, 6 TO 8),
XML_COMPRESSION = OFF ON PARTITIONS (3, 5)
);
Anmärkningar
När du skapar frågeplanen för -instruktionen CREATE INDEX
kan frågeoptimeraren välja att söka igenom ett annat index i stället för att utföra en tabellgenomsökning. Sorteringsåtgärden kan elimineras i vissa situationer. På datorer CREATE INDEX
med flera processorer kan du använda parallellitet för genomsöknings- och sorteringsåtgärder som är associerade med att skapa indexet, på samma sätt som andra frågor gör. Mer information finns i Konfigurera parallella indexåtgärder.
Åtgärden CREATE INDEX
kan vara minimalt loggad om databasåterställningsmodellen är inställd på antingen massloggad eller enkel.
Index kan skapas i en tillfällig tabell. När tabellen tas bort eller hamnar utanför omfånget tas indexen bort.
Ett klustrat index bygger på en tabellvariabel när en primärnyckelbegränsning läggs till. På samma sätt bygger ett icke-grupperat index på en tabellvariabel när en unik begränsning läggs till. När tabellvariabeln hamnar utanför omfånget tas indexen bort.
Index stöder utökade egenskaper.
CREATE INDEX
stöds inte i Microsoft Fabric.
Klustrade index
Om du skapar ett klustrade index i en tabell (heap) eller släpper och återskapar ett befintligt klustrat index måste ytterligare arbetsyta vara tillgänglig i databasen för datasortering och en tillfällig kopia av den ursprungliga tabellen eller befintliga klustrade indexdata. Mer information om klustrade index finns i Skapa klustrade index och arkitektur och designguide för SQL Server-index.
Icke-grupperade index
Från och med SQL Server 2016 (13.x), i Azure SQL Database och i Azure SQL Managed Instance kan du skapa ett icke-grupperat index i en tabell som lagras som ett grupperat kolumnlagringsindex. Om du först skapar ett icke-grupperat index i en tabell som lagras som ett heap- eller klustrade index bevaras indexet om du senare konverterar tabellen till ett grupperat kolumnlagringsindex. Det är inte heller nödvändigt att släppa det icke-illustrerade indexet när du återskapar det klustrade kolumnlagringsindexet.
Alternativet FILESTREAM_ON
är inte giltigt när du skapar ett icke-grupperat index i en tabell som lagras som ett grupperat kolumnlagringsindex.
Unika index
När det finns ett unikt index söker databasmotorn efter dubblettvärden varje gång data läggs till eller ändras. Åtgärder som genererar duplicerade nyckelvärden återställs och databasmotorn returnerar ett felmeddelande. Detta gäller även om datatillägget eller ändringsåtgärden ändrar många rader men bara orsakar en dubblett. Om ett försök görs att infoga rader när det finns ett unikt index med IGNORE_DUP_KEY
alternativet inställt på ON
ignoreras raderna som bryter mot det unika indexet.
Partitionerade index
Partitionerade index skapas och underhålls på ett liknande sätt som partitionerade tabeller, men precis som vanliga index hanteras de som separata databasobjekt. Du kan ha ett partitionerat index i en tabell som inte är partitionerad och du kan ha ett icke-partitionerat index i en tabell som är partitionerad.
Om du skapar ett index i en partitionerad tabell och inte anger en filgrupp som indexet ska placeras på partitioneras indexet på samma sätt som den underliggande tabellen. Det beror på att index som standard placeras i samma filgrupper som deras underliggande tabeller och för en partitionerad tabell i samma partitionsschema som använder samma partitioneringskolumner. När indexet använder samma partitionsschema och partitioneringskolumn som tabellen justeras indexet med tabellen.
Varning
Det är möjligt att skapa och återskapa nonaligerade index i en tabell med fler än 1 000 partitioner, men stöds inte. Detta kan orsaka försämrad prestanda eller överdriven minnesförbrukning under dessa åtgärder. Vi rekommenderar att du endast använder justerade index när antalet partitioner överskrider 1 000.
När du partitionerar ett icke-unikt grupperat index lägger databasmotorn som standard till alla partitioneringskolumner i listan över klustrade indexnycklar, om de inte redan har angetts.
Indexerade vyer kan skapas på partitionerade tabeller på samma sätt som index i tabeller. Mer information om partitionerade index finns i Partitionerade tabeller och index samt arkitektur och designguide för SQL Server-index.
När ett index skapas eller återskapas optimerar frågan uppdateringsstatistiken för indexet. För ett partitionerat index använder frågeoptimeraren standardsamplingsalgoritmen i stället för att söka igenom alla rader i tabellen efter ett icke-partitionerat index. Om du vill hämta statistik om partitionerade index genom att skanna alla rader i tabellen använder du CREATE STATISTICS
eller UPDATE STATISTICS
med FULLSCAN
-satsen.
Filtrerade index
Ett filtrerat index är ett optimerat icke-grupperat index som passar för frågor som väljer en liten procentandel rader från en tabell. Den använder ett filterpredikat för att indexera en del av data i tabellen. Ett väldesignat filtrerat index kan förbättra frågeprestanda, minska lagringskostnaderna och minska underhållskostnaderna.
Obligatoriska SET-alternativ för filtrerade index
Alternativen SET
i kolumnen Obligatoriskt värde krävs när något av följande villkor inträffar:
Du skapar ett filtrerat index.
En
INSERT
instruktion ,UPDATE
,DELETE
ellerMERGE
ändrar data i ett filtrerat index.Det filtrerade indexet används av frågeoptimeraren för att skapa frågeplanen.
SET
alternativObligatoriskt värde Standardservervärde Standardvärde för OLE DB och ODBC Standardvärde för DB-Library ANSI_NULLS
ON
ON
ON
OFF
ANSI_PADDING
ON
ON
ON
OFF
ANSI_WARNINGS
1ON
ON
ON
OFF
ARITHABORT
ON
ON
OFF
OFF
CONCAT_NULL_YIELDS_NULL
ON
ON
ON
OFF
NUMERIC_ROUNDABORT
OFF
OFF
OFF
OFF
QUOTED_IDENTIFIER
ON
ON
ON
OFF
1 Inställningen
ANSI_WARNINGS
anges implicitARITHABORT
tillON
ON
när databaskompatibilitetsnivån är inställd på 90 eller högre. Om databaskompatibilitetsnivån är inställd på 80 eller tidigareARITHABORT
måste alternativet uttryckligen anges tillON
.
Om alternativen SET
är felaktiga kan följande villkor inträffa:
- Det går inte att skapa det filtrerade indexet.
- Databasmotorn genererar ett fel och återställer instruktionen
INSERT
,UPDATE
,DELETE
ellerMERGE
som ändrar data i indexet. - Frågeoptimeraren tar inte hänsyn till indexet i körningsplanen för några Transact-SQL-instruktioner.
Mer information om filtrerade index finns i Skapa filtrerade index och arkitektur och designguide för SQL Server-index.
Rumsliga index
Information om rumsliga index finns i Översikt över CREATE SPATIAL INDEX och Spatial index.
XML-index
Information om XML-index finns i CREATE XML INDEX and XML Indexes (SQL Server).
Indexnyckelstorlek
Den maximala storleken för en indexnyckel är 900 byte för ett klustrat index och 1 700 byte för ett icke-grupperat index. (Före SQL Database och SQL Server 2016 (13.x) var gränsen alltid 900 byte.) Index för varchar-kolumner som överskrider bytegränsen kan skapas om befintliga data i kolumnerna inte överskrider gränsen när indexet skapas. Efterföljande infognings- eller uppdateringsåtgärder på kolumnerna som gör att den totala storleken blir större än gränsen misslyckas. Indexnyckeln för ett grupperat index får inte innehålla varchar kolumner som har befintliga data i ROW_OVERFLOW_DATA
allokeringsenhet. Om ett klustrat index skapas i en varchar-kolumn och befintliga data finns i IN_ROW_DATA
allokeringsenheten misslyckas efterföljande infognings- eller uppdateringsåtgärder i kolumnen som skulle skicka data från rad.
Icke-grupperade index kan innehålla icke-nyckelkolumner (ingår) i indexets lövnivå. Dessa kolumner beaktas inte av databasmotorn vid beräkning av indexnyckelns storlek. Mer information finns i Skapa index med inkluderade kolumner och arkitektur och designguide för SQL Server-index.
Not
Om partitioneringsnyckelkolumnerna inte redan finns i ett icke-unikt grupperat index läggs de till i indexet av databasmotorn när tabellerna partitioneras. Den kombinerade storleken på de indexerade kolumnerna (räknar inte inkluderade kolumner), plus eventuella tillagda partitioneringskolumner får inte överstiga 1 800 byte i ett icke-unikt grupperat index.
Beräknade kolumner
Index kan skapas på beräknade kolumner. Dessutom kan beräknade kolumner ha egenskapen PERSISTED
. Det innebär att databasmotorn lagrar de beräknade värdena i tabellen och uppdaterar dem när andra kolumner som den beräknade kolumnen är beroende av uppdateras på. Databasmotorn använder dessa bevarade värden när det skapar ett index i kolumnen och när indexet refereras i en fråga.
Om du vill indexera en beräknad kolumn måste den beräknade kolumnen vara deterministisk och exakt. Men om du använder PERSISTED
egenskapen expanderas typen av indexerbara beräknade kolumner till att omfatta:
- Beräknade kolumner baserade på Transact-SQL- och CLR-funktioner och CLR-användardefinierade typmetoder som markeras som deterministiska av användaren.
- Beräknade kolumner baserade på uttryck som är deterministiska enligt definitionen av databasmotorn men oprecisa.
Beständiga beräknade kolumner kräver att följande SET
alternativ anges enligt föregående avsnitt Obligatoriska SET-alternativ för filtrerade index.
Villkoret UNIQUE
eller PRIMARY KEY
kan innehålla en beräknad kolumn så länge den uppfyller alla villkor för indexering. Mer specifikt måste den beräknade kolumnen vara deterministisk och exakt eller deterministisk och bevarad. Mer information om determinism finns i Deterministiska och nondeterministiska funktioner.
Beräknade kolumner som härletts från bild, ntext, text, varchar(max), nvarchar(max), varbinary(max), och XML- datatyper kan indexeras antingen som en nyckel eller inkluderad icke-nyckelkolumn så länge datatypen för den beräknade kolumnen är tillåten som en indexnyckelkolumn eller icke-nyckelkolumn. Du kan till exempel inte skapa ett primärt XML-index på en beräknad xml- kolumn. Om indexnyckelns storlek överskrider 900 byte visas ett varningsmeddelande.
Om du skapar ett index i en beräknad kolumn kan det orsaka fel i en infognings- eller uppdateringsåtgärd som tidigare fungerade. Ett sådant fel kan inträffa när den beräknade kolumnen resulterar i ett aritmetikfel.
Till exempel i följande tabell, även om uttrycket för den beräknade kolumnen c
verkar resultera i ett aritmetikfel när raden infogas, fungerar -instruktionen INSERT
.
CREATE TABLE t1 (a INT, b INT, c AS a/b);
INSERT INTO t1 VALUES (1, 0);
Men om du skapar ett index för den beräknade kolumnen c
misslyckas samma INSERT
instruktion.
CREATE TABLE t1 (a INT, b INT, c AS a/b);
CREATE UNIQUE CLUSTERED INDEX Idx1 ON t1(c);
INSERT INTO t1 VALUES (1, 0);
Mer information finns i Index över beräknade kolumner.
Inkluderade kolumner i index
Icke-nyckelkolumner, som kallas inkluderade kolumner, kan läggas till på lövnivån för ett icke-grupperat index för att förbättra frågeprestandan genom att täcka frågan. Det betyder att alla kolumner som refereras i frågan ingår i indexet som antingen nyckelkolumner eller icke-nyckelkolumner. På så sätt kan frågeoptimeraren hämta all nödvändig information från en icke-illustrerad indexgenomsökning eller sökning. tabell- eller klustrade indexdata används inte. Mer information finns i Skapa index med inkluderade kolumner och arkitektur och designguide för SQL Server-index.
Ange indexalternativ
SQL Server 2005 (9.x) introducerade nya indexalternativ och ändrade även hur alternativ anges. I den bakåtkompatibla syntaxen WITH option_name
motsvarar WITH (option_name = ON)
. När du anger indexalternativ gäller följande regler:
- Nya indexalternativ kan bara anges med hjälp av
WITH (<option_name> = <ON | OFF>)
. - Alternativ kan inte anges med både bakåtkompatibel och ny syntax i samma instruktion. Om du till exempel anger
WITH (DROP_EXISTING, ONLINE = ON)
misslyckas instruktionen. - När du skapar ett XML-index måste alternativen anges med hjälp av
WITH (<option_name> = <ON | OFF>)
.
DROP_EXISTING-sats
Du kan använda satsen DROP_EXISTING
för att återskapa indexet, lägga till eller släppa kolumner, ändra alternativ, ändra kolumnsorteringsordning eller ändra partitionsschemat eller filgruppen.
Om indexet framtvingar en PRIMARY KEY
eller UNIQUE
begränsning och indexdefinitionen inte ändras på något sätt, tas indexet bort och skapas på nytt, vilket bevarar den befintliga begränsningen. Men om indexdefinitionen ändras misslyckas -instruktionen. Om du vill ändra definitionen av en PRIMARY KEY
eller UNIQUE
-begränsningen släpper du villkoret och lägger till en begränsning med den nya definitionen.
DROP_EXISTING
förbättrar prestandan när du återskapar ett klustrat index, med antingen samma eller en annan uppsättning nycklar, i en tabell som också har icke-grupperade index.
DROP_EXISTING
ersätter körningen av en DROP INDEX
-instruktion för det gamla klustrade indexet följt av körningen av en CREATE INDEX
-instruktion för det nya klustrade indexet. De icke-grupperade indexen återskapas en gång och sedan bara om indexdefinitionen har ändrats. Satsen DROP_EXISTING
återskapar inte de icke-illustrerade indexen när indexdefinitionen har samma indexnamn, nyckel- och partitionskolumner, unika attribut och sorteringsordning som det ursprungliga indexet.
Oavsett om de icke-grupperade indexen återskapas eller inte finns de alltid kvar i sina ursprungliga filgrupper eller partitionsscheman och använder de ursprungliga partitionsfunktionerna. Om ett klustrat index återskapas till ett annat filgrupps- eller partitionsschema flyttas inte de icke-grupperade indexen för att sammanfalla med den nya platsen för det klustrade indexet. Även om de icke-grupperade indexen tidigare var justerade med det klustrade indexet kanske de inte längre är i linje med det. Mer information om partitionerad indexjustering finns i Partitionerade tabeller och index.
DROP_EXISTING
Satsen sorterar inte data igen om samma indexnyckelkolumner används i samma ordning och med samma stigande eller fallande ordning, såvida inte indexsatsen anger ett icke-grupperat index och ONLINE
alternativet är inställt på OFF
. Om det klustrade indexet är inaktiverat CREATE INDEX WITH DROP_EXISTING
måste åtgärden utföras med ONLINE
värdet OFF
. Om ett icke-grupperat index är inaktiverat och inte är associerat med ett inaktiverat grupperat index kan CREATE INDEX WITH DROP_EXISTING
åtgärden utföras med ONLINE
inställt på OFF
eller ON
.
Not
När index med 128 omfattningar eller mer tas bort eller återskapas, defersar databasmotorn de faktiska sidallokeringarna och deras associerade lås tills transaktionen har checkats in. Mer information finns i Uppskjuten frigöring.
ONLINE-alternativ
Följande riktlinjer gäller för att utföra indexåtgärder online:
- Den underliggande tabellen kan inte ändras, trunkeras eller tas bort när en onlineindexåtgärd pågår.
- Ytterligare tillfälligt diskutrymme krävs under indexåtgärden.
- Onlineåtgärder kan utföras på partitionerade index och index som innehåller beständiga beräknade kolumner eller inkluderade kolumner.
- Med
WAIT_AT_LOW_PRIORITY
argumentalternativet kan du bestämma hur indexåtgärden ska fortsätta när den väntar på ettSch-M
lås. Mer information finns i WAIT_AT_LOW_PRIORITY
Mer information finns i Utföra indexåtgärder online.
Återupptabara indexåtgärder
gäller för: SQL Server 2019 (15.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance
Du kan göra en åtgärd för att skapa onlineindex återupptas. Det innebär att indexversionen kan stoppas och senare startas om från den punkt där den stoppades. Om du vill köra en indexversion som återupptabar anger du alternativet RESUMABLE = ON
.
Följande riktlinjer gäller för återupptabara indexåtgärder:
- Om du vill använda alternativet
RESUMABLE
måste du också använda alternativetONLINE
. - Alternativet
RESUMABLE
sparas inte i metadata för ett visst index och gäller endast varaktigheten för den aktuella DDL-instruktionen. Därför måsteRESUMABLE = ON
-satsen anges uttryckligen för att möjliggöra återupptagande. - Alternativet
MAX_DURATION
kan anges i två kontexter:-
MAX_DURATION
för alternativetRESUMABLE
anger tidsintervallet för ett index som återskapas. Efter den här tiden har förflutit, och om indexet återskapas fortfarande körs, pausas det. Du bestämmer när återskapande för ett pausat index kan återupptas. Den tiden i minuter förMAX_DURATION
måste vara större än 0 minuter och mindre än eller lika med en vecka (7 * 24 * 60 = 10080 minuter). En lång paus i en indexåtgärd kan märkbart påverka DML-prestanda för en specifik tabell samt databasdiskkapaciteten eftersom både det ursprungliga indexet och det nyligen skapade indexet kräver diskutrymme och måste uppdateras av DML-åtgärder. OmMAX_DURATION
alternativet utelämnas fortsätter indexåtgärden tills det har slutförts eller tills ett fel inträffar. -
MAX_DURATION
för alternativetWAIT_AT_LOW_PRIORITY
anger tiden att vänta med hjälp av lås med låg prioritet om indexåtgärden blockeras innan åtgärden vidtas. Mer information finns i WAIT_AT_LOW_PRIORITY med onlineindexåtgärder.
-
- Om du vill pausa indexåtgärden direkt kan du köra kommandot
ALTER INDEX PAUSE
eller köra kommandotKILL <session_id>
. - Om du kör den ursprungliga
CREATE INDEX
instruktionen igen med samma parametrar återupptas en pausad indexgenereringsåtgärd. Du kan också återuppta en pausad indexgenereringsåtgärd genom att köra -instruktionenALTER INDEX RESUME
. - Kommandot
ABORT
stoppar sessionen som kör en indexversion och avbryter indexåtgärden. Du kan inte återuppta en indexåtgärd som har avbrutits.
En återupptabar indexåtgärd körs tills den har slutförts, pausar eller misslyckas. Om åtgärden pausas utfärdas ett fel som anger att åtgärden har pausats och att indexet inte har skapats. Om åtgärden misslyckas utfärdas även ett fel.
Om du vill se om en indexåtgärd körs som en återupptabar åtgärd och kontrollera dess aktuella körningstillstånd använder du sys.index_resumable_operations katalogvyn.
Resurser
Följande resurser krävs för att återuppta indexåtgärder:
- Ytterligare utrymme krävs för att behålla indexet som skapas, inklusive tiden då bygget pausas.
- Ytterligare loggdataflöde under sorteringsfasen. Den totala loggutrymmesanvändningen för återupptabart index är mindre jämfört med vanlig onlineindexskapande och tillåter loggtrunkering under den här åtgärden.
- DDL-instruktioner som försöker ändra tabellen som är associerad med indexet som skapas medan indexåtgärden pausas tillåts inte.
- Ghost-rensning blockeras i det inbyggda indexet under åtgärdens varaktighet både när åtgärden pausas och medan åtgärden körs.
- Om tabellen innehåller LOB-kolumner krävs ett schemaändringslås (
Sch-M
) i början av åtgärden för att kunna återuppta klustrad indexversion.
Aktuella funktionsbegränsningar
Åtgärder för att skapa index som kan återupptas har följande begränsningar:
- När en återupptabar onlineindexskapandeåtgärd har pausats kan det ursprungliga värdet
MAXDOP
för inte ändras. - Alternativet
SORT_IN_TEMPDB = ON
stöds inte för återupptabara indexåtgärder. - DDL-kommandot med
RESUMABLE = ON
kan inte köras i en explicit transaktion. - Du kan inte skapa ett återupptabart index som innehåller:
- Beräknade eller
timestamp
(rowversion
) kolumner som nyckelkolumner. - LOB-kolumn som en inkluderad kolumn.
- Beräknade eller
- Återupptabara indexåtgärder stöds inte för:
- Kommandot
ALTER INDEX REBUILD ALL
- Kommandot
ALTER TABLE REBUILD
- Kolumnlagerindexar
- Filtrerade index
- Inaktiverade index
- Kommandot
WAIT_AT_LOW_PRIORITY med onlineindexåtgärder
gäller för: SQL Server 2022 (16.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance
När du inte använder WAIT_AT_LOW_PRIORITY
alternativet måste alla aktiva blockerande transaktioner som innehåller lås på tabellen eller indexet slutföras för att indexskapandeåtgärden ska starta och slutföras. När onlineindexåtgärden startar och innan den slutförs måste den hämta ett delat (S
) eller en schemaändring (Sch-M
) låsa tabellen och hålla den under en kort tid. Även om låset endast hålls under en kort tid kan det avsevärt påverka arbetsbelastningens dataflöde, öka frågefördröjningen eller orsaka tidsgränser för körning.
För att undvika dessa problem kan du med alternativet WAIT_AT_LOW_PRIORITY
hantera beteendet för S
eller Sch-M
lås som krävs för att en onlineindexåtgärd ska starta och slutföras och välja bland tre alternativ. Om det under den väntetid som anges av MAX_DURATION = n [minutes]
inte finns någon blockering som omfattar indexåtgärden fortsätter indexåtgärden omedelbart.
WAIT_AT_LOW_PRIORITY
gör att onlineindexåtgärden väntar med hjälp av lås med låg prioritet, vilket gör att andra åtgärder som använder normala prioritetslås kan fortsätta under tiden. Om du utelämnar alternativet WAIT_AT_LOW_PRIORITY
motsvarar det WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE)
.
MAX_DURATION
=
tid [MINUTES
]
Väntetiden (ett heltalsvärde som anges i minuter) som onlineindexåtgärden väntar med hjälp av lås med låg prioritet. Om åtgärden blockeras under MAX_DURATION
tid körs den angivna ABORT_AFTER_WAIT
åtgärden.
MAX_DURATION
tiden är alltid i minuter och ordet MINUTES
kan utelämnas.
ABORT_AFTER_WAIT
= [NONE
| SELF
| BLOCKERS
]
-
NONE
: Fortsätt att vänta på låset med normal prioritet. -
SELF
: Avsluta den onlineindexåtgärd som körs för närvarande, utan att vidta några åtgärder. AlternativetSELF
kan inte användas närMAX_DURATION
är 0. -
BLOCKERS
: Avsluta alla användartransaktioner som blockerar onlineindexåtgärden så att åtgärden kan fortsätta. AlternativetBLOCKERS
kräver att huvudkontot som körCREATE INDEX
- ellerALTER INDEX
-instruktionen harALTER ANY CONNECTION
behörighet.
Du kan använda följande utökade händelser för att övervaka indexåtgärder som väntar på lås med låg prioritet:
lock_request_priority_state
process_killed_by_abort_blockers
ddl_with_wait_at_low_priority
Alternativ för rad- och sidlås
När ALLOW_ROW_LOCKS = ON
och ALLOW_PAGE_LOCK = ON
tillåts rad-, sid- och tabellnivålås vid åtkomst till indexet. Databasmotorn väljer lämpligt lås och kan eskalera låset från ett rad- eller sidlås till ett tabelllås.
När ALLOW_ROW_LOCKS = OFF
och ALLOW_PAGE_LOCK = OFF
tillåts endast ett lås på tabellnivå vid åtkomst till indexet.
Varning
Vi rekommenderar inte att du inaktiverar rad- eller sidlås på ett index. Samtidighetsrelaterade problem kan uppstå och vissa funktioner kan vara otillgängliga. Ett index kan till exempel inte ordnas om när ALLOW_PAGE_LOCKS
är inställt på OFF
.
Sekventiella nycklar
Gäller för: SQL Server 2019 (15.x) och senare versioner, i Azure SQL Database och i Azure SQL Managed Instance.
Konkurrens vid infogning på sista sidan är ett vanligt prestandaproblem som uppstår när ett stort antal samtidiga trådar försöker infoga rader i ett index med en sekventiell nyckel. Ett index betraktas som sekventiellt när den inledande nyckelkolumnen innehåller värden som alltid ökar (eller minskar), till exempel en identitetskolumn eller ett datum som är standard för aktuellt datum/tid. Eftersom nycklarna som infogas är sekventiella infogas alla nya rader i slutet av indexstrukturen , med andra ord på samma sida. Detta leder till konkurrens om sidan i minnet som kan observeras som flera trådar som väntar på att hämta en spärr för sidan i fråga. Motsvarande väntetyp är PAGELATCH_EX
.
Om du aktiverar alternativet OPTIMIZE_FOR_SEQUENTIAL_KEY
index kan du optimera databasmotorn som hjälper till att förbättra dataflödet för infogningar med hög samtidighet i indexet. Den är avsedd för index som har en sekventiell nyckel och därmed är benägna att infoga konkurrens på sista sidan, men det kan också hjälpa till med index som har hot spots i andra områden i B-Tree-indexstrukturen.
Not
I dokumentationen används termen B-träd vanligtvis som referens till index. I radlagringsindex implementerar databasmotorn ett B+-träd. Detta gäller inte för kolumnlagringsindex eller index i minnesoptimerade tabeller. Mer information finns i arkitekturen och designguiden för SQL Server och Azure SQL-index.
Datakomprimering
Mer information om datakomprimering finns i Datakomprimering.
Följande är de viktigaste punkterna att tänka på i samband med indexgenereringsåtgärder när datakomprimering används:
- Komprimering kan tillåta att fler rader lagras på en sida, men ändrar inte den maximala radstorleken.
- Icke-lövsidor i ett index är inte sidkomprimerade utan kan radkomprimeras.
- Varje icke-grupperat index har en individuell komprimeringsinställning och ärver inte komprimeringsinställningen för den underliggande tabellen.
- När ett klustrat index skapas på en heap ärver det klustrade indexet heapens komprimeringstillstånd om inte ett alternativt komprimeringstillstånd anges.
Om du vill utvärdera hur ändring av komprimeringstillståndet påverkar utrymmesanvändningen av en tabell, ett index eller en partition använder du den sp_estimate_data_compression_savings lagrade proceduren.
XML-komprimering
gäller för: SQL Server 2022 (16.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance.
Många av övervägandena för datakomprimering gäller XML-komprimering. Du bör också vara medveten om följande överväganden:
- När en lista över partitioner har angetts kan XML-komprimering aktiveras på enskilda partitioner. Om listan över partitioner inte har angetts är alla partitioner inställda på att använda XML-komprimering. När en tabell eller ett index skapas inaktiveras XML-datakomprimering om inget annat anges. När en tabell ändras bevaras den befintliga komprimering om inget annat anges.
- Om du anger en lista över partitioner eller en partition som ligger utom räckhåll genereras ett fel.
- När ett klustrat index skapas på en heap ärver det klustrade indexet heapens XML-komprimeringstillstånd om inte ett alternativt komprimeringsalternativ har angetts.
- Om du ändrar XML-komprimeringsinställningen för en heap måste alla icke-illustrerade index i tabellen återskapas så att de har pekare till de nya radplatserna i heapen.
- Du kan aktivera eller inaktivera XML-komprimering online eller offline. Aktivering av komprimering på en heap är en tråd för en onlineåtgärd.
- Om du vill fastställa XML-komprimeringstillståndet för partitioner i en partitionerad tabell använder du
xml_compression
kolumnen isys.partitions
katalogvyn.
Indexstatistik
När ett radlagringsindex skapas skapar databasmotorn även statistik över nyckelkolumnerna i indexet. Namnet på statistikobjektet i katalogvyn sys.stats matchar indexets namn. För ett icke-partitionerat index skapas statistiken med en fullständig genomsökning av data. För ett partitionerat index skapas statistik med hjälp av standardsamplingsalgoritmen.
När ett kolumnlagringsindex skapas skapar databasmotorn även ett statistikobjekt i sys.stats . Det här statistikobjektet innehåller inte statistikdata som histogrammet och densitetsvektorn. Den används när du skapar en databasklon genom att skripta databasen. Vid den tidpunkten DBCC SHOW_STATISTICS
används kommandona och UPDATE STATISTICS ... WITH STATS_STREAM
för att hämta kolumnlagringsmetadata som segment, ordlista och deltalagringsstorlek och lägga till dem i statistiken för kolumnlagringsindexet. Dessa metadata hämtas dynamiskt vid frågekompilering för en vanlig databas, men tillhandahålls av statistikobjektet för en databasklon. Kommandot UPDATE STATISTICS stöds inte för statistikobjektet i ett columnstore-index i något annat scenario.
Behörigheter
Kräver behörighet för ALTER
tabellen eller vyn eller medlemskapet i den fasta databasrollen db_ddladmin
.
Begränsningar och begränsningar
I Azure Synapse Analytics and Analytics Platform System (PDW) kan du inte skapa:
- Ett grupperat eller icke-grupperat radlagringsindex i en informationslagertabell när det redan finns ett kolumnlagringsindex. Det här beteendet skiljer sig från SMP SQL Server som gör att både rowstore- och columnstore-index kan samexistera i samma tabell.
- Du kan inte skapa ett index i en vy.
Metadata
Om du vill visa information om befintliga index kan du fråga sys.indexes katalogvy.
Versionsanteckningar
- Azure SQL Database stöder inte andra filgrupper än
PRIMARY
. - Azure SQL Database och Azure SQL Managed Instance stöder inte
FILESTREAM
alternativ. - Kolumnlagringsindex är inte tillgängliga före SQL Server 2012 (11.x).
- Återupptabara indexåtgärder är tillgängliga från och med SQL Server 2017 (14.x), i Azure SQL Database och i Azure SQL Managed Instance.
Exempel: Alla versioner. Använder AdventureWorks-databasen
A. Skapa ett enkelt icke-grupperat radlagringsindex
I följande exempel skapas ett icke-grupperat index i kolumnen VendorID
i tabellen Purchasing.ProductVendor
.
CREATE INDEX IX_VendorID ON ProductVendor (VendorID);
CREATE INDEX IX_VendorID ON dbo.ProductVendor (VendorID DESC, Name ASC, Address DESC);
CREATE INDEX IX_VendorID ON Purchasing..ProductVendor (VendorID);
B. Skapa ett enkelt sammansatt rowstore-index som inte visas
I följande exempel skapas ett icke-grupperat sammansatt index i kolumnerna SalesQuota
och SalesYTD
i tabellen Sales.SalesPerson
.
CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson (SalesQuota, SalesYTD);
C. Skapa ett index i en tabell i en annan databas
I följande exempel skapas ett grupperat index i kolumnen VendorID
i tabellen ProductVendor
i databasen Purchasing
.
CREATE CLUSTERED INDEX IX_ProductVendor_VendorID ON Purchasing..ProductVendor (VendorID);
D. Lägga till en kolumn i ett index
I följande exempel skapas index IX_FF med två kolumner från dbo. FactFinance-tabell. Nästa instruktion återskapar indexet med ytterligare en kolumn och behåller det befintliga namnet.
CREATE INDEX IX_FF ON dbo.FactFinance (FinanceKey ASC, DateKey ASC);
-- Rebuild and add the OrganizationKey
CREATE INDEX IX_FF ON dbo.FactFinance (FinanceKey, DateKey, OrganizationKey DESC)
WITH (DROP_EXISTING = ON);
Exempel: SQL Server, Azure SQL Database
E. Skapa ett unikt icke-grupperat index
I följande exempel skapas ett unikt icke-illustrerat index i kolumnen Name
i Production.UnitMeasure
-tabellen i AdventureWorks2022
-databasen. Indexet framtvingar unikhet för data som infogas i kolumnen Name
.
CREATE UNIQUE INDEX AK_UnitMeasure_Name
ON Production.UnitMeasure(Name);
Följande fråga testar unikhetsbegränsningen genom att försöka infoga en rad med samma värde som i en befintlig rad.
-- Verify the existing value.
SELECT Name FROM Production.UnitMeasure WHERE Name = N'Ounces';
GO
INSERT INTO Production.UnitMeasure (UnitMeasureCode, Name, ModifiedDate)
VALUES ('OC', 'Ounces', GETDATE());
Det resulterande felmeddelandet är:
Server: Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'UnitMeasure' with unique index 'AK_UnitMeasure_Name'. The statement has been terminated.
F. Använd alternativet IGNORE_DUP_KEY
I följande exempel visas effekten av alternativet IGNORE_DUP_KEY
genom att infoga flera rader i en tillfällig tabell först med alternativet inställt på ON
och igen med alternativet inställt på OFF
. En enskild rad infogas i tabellen #Test
som avsiktligt orsakar ett duplicerat värde när den andra instruktionen för flera rader INSERT
körs. Antalet rader i tabellen returnerar antalet infogade rader.
CREATE TABLE #Test (C1 NVARCHAR(10), C2 NVARCHAR(50), C3 DATETIME);
GO
CREATE UNIQUE INDEX AK_Index ON #Test (C2)
WITH (IGNORE_DUP_KEY = ON);
GO
INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;
GO
SELECT COUNT(*) AS [Number of rows] FROM #Test;
GO
DROP TABLE #Test;
GO
Här är resultatet av den andra INSERT
-instruktionen.
Server: Msg 3604, Level 16, State 1, Line 5 Duplicate key was ignored.
Number of rows
--------------
38
Observera att de rader som infogats från tabellen Production.UnitMeasure
som inte bröt mot unikhetsbegränsningen har infogats. En varning utfärdades och dubblettraden ignorerades, men hela transaktionen återställdes inte.
Samma instruktioner körs igen, men med IGNORE_DUP_KEY
inställt på OFF
.
CREATE TABLE #Test (C1 NVARCHAR(10), C2 NVARCHAR(50), C3 DATETIME);
GO
CREATE UNIQUE INDEX AK_Index ON #Test (C2)
WITH (IGNORE_DUP_KEY = OFF);
GO
INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;
GO
SELECT COUNT(*) AS [Number of rows] FROM #Test;
GO
DROP TABLE #Test;
GO
Här är resultatet av den andra INSERT
-instruktionen.
Server: Msg 2601, Level 14, State 1, Line 5
Cannot insert duplicate key row in object '#Test' with unique index
'AK_Index'. The statement has been terminated.
Number of rows
--------------
1
Observera att ingen av raderna från den Production.UnitMeasure
tabellen infogades i tabellen trots att endast en rad i tabellen bröt mot UNIQUE
indexvillkor.
G. Använda DROP_EXISTING för att släppa och återskapa ett index
I följande exempel släpps och återskapas ett befintligt index i kolumnen ProductID
i tabellen Production.WorkOrder
i AdventureWorks2022
-databasen med hjälp av alternativet DROP_EXISTING
. Alternativen FILLFACTOR
och PAD_INDEX
anges också.
CREATE NONCLUSTERED INDEX IX_WorkOrder_ProductID
ON Production.WorkOrder(ProductID)
WITH (FILLFACTOR = 80,
PAD_INDEX = ON,
DROP_EXISTING = ON);
GO
H. Skapa ett index i en vy
I följande exempel skapas en vy och ett index för den vyn. Två frågor ingår som använder den indexerade vyn.
-- Set the options to support indexed views
SET NUMERIC_ROUNDABORT OFF;
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
QUOTED_IDENTIFIER, ANSI_NULLS ON;
GO
-- Create view with schemabinding
IF OBJECT_ID ('Sales.vOrders', 'view') IS NOT NULL
DROP VIEW Sales.vOrders;
GO
CREATE VIEW Sales.vOrders
WITH SCHEMABINDING
AS
SELECT SUM(UnitPrice * OrderQty * (1.00 - UnitPriceDiscount)) AS Revenue,
OrderDate, ProductID, COUNT_BIG(*) AS COUNT
FROM Sales.SalesOrderDetail AS od, Sales.SalesOrderHeader AS o
WHERE od.SalesOrderID = o.SalesOrderID
GROUP BY OrderDate, ProductID;
GO
-- Create an index on the view
CREATE UNIQUE CLUSTERED INDEX IDX_V1
ON Sales.vOrders (OrderDate, ProductID);
GO
-- This query can use the indexed view even though the view is
-- not specified in the FROM clause.
SELECT SUM(UnitPrice * OrderQty * (1.00 - UnitPriceDiscount)) AS Rev,
OrderDate, ProductID
FROM Sales.SalesOrderDetail AS od
JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID = o.SalesOrderID
AND ProductID BETWEEN 700 AND 800
AND OrderDate >= CONVERT(DATETIME, '05/01/2002', 101)
GROUP BY OrderDate, ProductID
ORDER BY Rev DESC;
GO
-- This query can use the above indexed view
SELECT OrderDate, SUM(UnitPrice * OrderQty * (1.00 - UnitPriceDiscount)) AS Rev
FROM Sales.SalesOrderDetail AS od
JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID = o.SalesOrderID
AND DATEPART(mm, OrderDate) = 3
AND DATEPART(yy, OrderDate) = 2002
GROUP BY OrderDate
ORDER BY OrderDate ASC;
GO
Jag. Skapa ett index med inkluderade kolumner (icke-nyckel)
I följande exempel skapas ett icke-grupperat index med en nyckelkolumn (PostalCode
) och fyra icke-nyckelkolumner (AddressLine1
, AddressLine2
, City
, StateProvinceID
). En fråga som omfattas av indexet följer. Om du vill visa det index som har valts av frågeoptimeraren går du till menyn Query i SQL Server Management Studio och väljer Visa verklig körningsplan innan du kör frågan.
CREATE NONCLUSTERED INDEX IX_Address_PostalCode
ON Person.Address (PostalCode)
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);
GO
SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN N'98000' and N'99999';
GO
J. Skapa ett partitionerat index
I följande exempel skapas ett icke-grupperat partitionerat index på TransactionsPS1
, ett befintligt partitionsschema i AdventureWorks2022
-databasen. Det här exemplet förutsätter att det partitionerade indexexemplet har installerats.
CREATE NONCLUSTERED INDEX IX_TransactionHistory_ReferenceOrderID
ON Production.TransactionHistory (ReferenceOrderID)
ON TransactionsPS1 (TransactionDate);
GO
K. Skapa ett filtrerat index
I följande exempel skapas ett filtrerat index i tabellen Production.BillOfMaterials i databasen AdventureWorks2022
. Filterpredikatet kan innehålla kolumner som inte är nyckelkolumner i det filtrerade indexet. Predikatet i det här exemplet väljer endast de rader där EndDate inte är NULL.
CREATE NONCLUSTERED INDEX "FIBillOfMaterialsWithEndDate"
ON Production.BillOfMaterials (ComponentID, StartDate)
WHERE EndDate IS NOT NULL;
L. Skapa ett komprimerat index
I följande exempel skapas ett index i en icke-partitionerad tabell med hjälp av radkomprimering.
CREATE NONCLUSTERED INDEX IX_INDEX_1
ON T1 (C2)
WITH (DATA_COMPRESSION = ROW);
GO
I följande exempel skapas ett index i en partitionerad tabell med hjälp av radkomprimering på alla partitioner i indexet.
CREATE CLUSTERED INDEX IX_PartTab2Col1
ON PartitionTable1 (Col1)
WITH (DATA_COMPRESSION = ROW);
GO
I följande exempel skapas ett index i en partitionerad tabell med hjälp av sidkomprimering på partition 1
av index- och radkomprimering på partitioner 2
via 4
av indexet.
CREATE CLUSTERED INDEX IX_PartTab2Col1
ON PartitionTable1 (Col1)
WITH (
DATA_COMPRESSION = PAGE ON PARTITIONS(1),
DATA_COMPRESSION = ROW ON PARTITIONS (2 TO 4)
);
GO
M. Skapa ett index med XML-komprimering
gäller för: SQL Server 2022 (16.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance.
I följande exempel skapas ett index i en icke-partitionerad tabell med hjälp av XML-komprimering. Minst en kolumn i indexet måste vara xml- datatyp.
CREATE NONCLUSTERED INDEX IX_INDEX_1
ON T1 (C2)
WITH (XML_COMPRESSION = ON);
GO
I följande exempel skapas ett index i en partitionerad tabell med hjälp av XML-komprimering på alla partitioner i indexet.
CREATE CLUSTERED INDEX IX_PartTab2Col1
ON PartitionTable1 (Col1)
WITH (XML_COMPRESSION = ON);
GO
N. Skapa, återuppta, pausa och avbryta återupptabara indexåtgärder
gäller för: SQL Server 2019 (15.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance
-- Execute a resumable online index create statement with MAXDOP=1
CREATE INDEX test_idx1 ON test_table (col1) WITH (ONLINE = ON, MAXDOP = 1, RESUMABLE = ON);
-- Executing the same command again (see above) after an index operation was paused, resumes automatically the index create operation.
-- Execute a resumable online index creates operation with MAX_DURATION set to 240 minutes. After the time expires, the resumable index create operation is paused.
CREATE INDEX test_idx2 ON test_table (col2) WITH (ONLINE = ON, RESUMABLE = ON, MAX_DURATION = 240);
-- Pause a running resumable online index creation
ALTER INDEX test_idx1 ON test_table PAUSE;
ALTER INDEX test_idx2 ON test_table PAUSE;
-- Resume a paused online index creation
ALTER INDEX test_idx1 ON test_table RESUME;
ALTER INDEX test_idx2 ON test_table RESUME;
-- Abort resumable index create operation which is running or paused
ALTER INDEX test_idx1 ON test_table ABORT;
ALTER INDEX test_idx2 ON test_table ABORT;
O. SKAPA INDEX med olika låsalternativ med låg prioritet
I följande exempel används alternativet WAIT_AT_LOW_PRIORITY
för att ange olika strategier för att hantera blockering.
--Kill this session after waiting 5 minutes
CREATE CLUSTERED INDEX idx_1 ON dbo.T2 (a) WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 5 MINUTES, ABORT_AFTER_WAIT = SELF)));
GO
--Kill blocker sessions
CREATE CLUSTERED INDEX idx_1 ON dbo.T2 (a) WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 5 MINUTES, ABORT_AFTER_WAIT = BLOCKERS)));
GO
I följande exempel används både alternativet RESUMABLE
och två MAX_DURATION
värden, det första gäller för alternativet ABORT_AFTER_WAIT
, det andra gäller för alternativet RESUMABLE
.
--With resumable option; default locking behavior
CREATE CLUSTERED INDEX idx_1 ON dbo.T2 (a) WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 5 MINUTES, ABORT_AFTER_WAIT = NONE)), RESUMABLE = ON, MAX_DURATION = 240 MINUTES);
Exempel: Azure Synapse Analytics and Analytics Platform System (PDW)
P. Grundläggande syntax
Skapa, återuppta, pausa och avbryta återupptabara indexåtgärder
gäller för: SQL Server 2019 (15.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance
-- Execute a resumable online index create statement with MAXDOP=1
CREATE INDEX test_idx ON test_table WITH (ONLINE = ON, MAXDOP = 1, RESUMABLE = ON);
-- Executing the same command again (see above) after an index operation was paused, resumes automatically the index create operation.
-- Execute a resumable online index creates operation with MAX_DURATION set to 240 minutes. After the time expires, the resumable index create operation is paused.
CREATE INDEX test_idx ON test_table WITH (ONLINE = ON, RESUMABLE = ON, MAX_DURATION = 240);
-- Pause a running resumable online index creation
ALTER INDEX test_idx ON test_table PAUSE;
-- Resume a paused online index creation
ALTER INDEX test_idx ON test_table RESUME;
-- Abort resumable index create operation which is running or paused
ALTER INDEX test_idx ON test_table ABORT;
Q. Skapa ett icke-grupperat index i en tabell i den aktuella databasen
I följande exempel skapas ett icke-grupperat index i kolumnen VendorID
i tabellen ProductVendor
.
CREATE INDEX IX_ProductVendor_VendorID
ON ProductVendor (VendorID);
R. Skapa ett grupperat index i en tabell i en annan databas
I följande exempel skapas ett icke-grupperat index i kolumnen VendorID
i tabellen ProductVendor
i databasen Purchasing
.
CREATE CLUSTERED INDEX IX_ProductVendor_VendorID
ON Purchasing..ProductVendor (VendorID);
S. Skapa ett ordnat grupperat index i en tabell
I följande exempel skapas ett ordnat grupperat index på kolumnerna c1
och c2
i tabellen T1
i MyDB
-databasen.
CREATE CLUSTERED COLUMNSTORE INDEX MyOrderedCCI ON MyDB.dbo.T1
ORDER (c1, c2);
T. Konvertera en CCI till ett ordnat grupperat index i en tabell
I följande exempel konverteras det befintliga klustrade kolumnlagringsindexet till ett ordnat grupperat kolumnlagringsindex med namnet MyOrderedCCI
i kolumnerna c1
och c2
i T2
-tabellen i MyDB
-databasen.
CREATE CLUSTERED COLUMNSTORE INDEX MyOrderedCCI ON MyDB.dbo.T2
ORDER (c1, c2)
WITH (DROP_EXISTING = ON);
Relaterat innehåll
- arkitektur- och designguide för SQL Server-index
- utföra indexåtgärder online
- Index och ALTER TABLE
- ALTER INDEX
- CREATE PARTITION FUNCTION
- SKAPA PARTITIONSSCHEMA
- SKAPA SPATIAL INDEX
- SKAPA STATISTIK
- CREATE TABLE
- CREATE XML INDEX
- datatyper
- DBCC-SHOW_STATISTICS
- DROP INDEX
- XML-index (SQL Server)
- sys.indexes
- sys.index_columns
- sys.xml_index
- EVENTDATA