SKAPA INDEX (Transact-SQL)
gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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 och SQL Database.
Information om riktlinjer för indexdesign finns i designguiden 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) och SQL Database 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 Indexes – Data Warehouse.
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. Ett grupperat index i en vy måste vara unikt.
Databasmotorn tillåter inte att du skapar ett unikt index för kolumner som redan innehåller duplicerade värden, oavsett om IGNORE_DUP_KEY
är inställt på PÅ eller inte. Om detta provas visas ett felmeddelande i databasmotorn. Dubblettvärden måste tas bort innan ett unikt index kan skapas i kolumnen eller kolumnerna. Kolumner som används i ett unikt index bör anges till NOT NULL, eftersom flera null-värden betraktas som dubbletter när ett unikt index skapas.
KLUSTRADE
Skapar ett index där nyckelvärdenas logiska ordning avgör den fysiska ordningen för motsvarande rader i en tabell. Den nedersta nivån, eller lövnivån för det klustrade indexet, innehåller de faktiska dataraderna i tabellen. En tabell eller vy tillåts ett grupperat index i taget.
En vy med ett unikt grupperat index kallas för en indexerad vy. 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.
Om CLUSTERED
inte anges skapas ett icke-grupperat index.
Not
Eftersom lövnivån för ett klustrat index och datasidorna är desamma per definition flyttar skapandet av ett grupperat index och med hjälp av satsen ON partition_scheme_name
eller ON filegroup_name
en tabell från den filgrupp där tabellen skapades till det nya partitionsschemat eller filgruppen. 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 som anger den logiska ordningen för en tabell. Med ett icke-grupperat index är den fysiska ordningen på dataraderna oberoende av deras indexerade ordning.
Varje tabell kan ha upp till 999 icke-grupperade index, oavsett hur indexen skapas: antingen implicit med PRIMÄRNYCKEL och UNIKA begränsningar, eller uttryckligen 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. En vydefinition kan inte heller innehålla ntext, texteller bild kolumner, även om de inte refereras till i CREATE INDEX
-instruktionen.
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 det icke-grupperade indexet. 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 klustrade indexkolumner 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) och Azure SQL Database, 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 onlinealternativet.
Beräknade kolumner som är deterministiska och antingen exakta eller oprecisa kan inkluderas kolumner. Beräknade kolumner som härletts från bild, ntext, text, varchar(max), nvarchar(max)kan varbinary(max), och XML- datatyper inkluderas i icke-nyckelkolumner så länge datatyperna för beräknade kolumner är tillåtna som en inkluderad kolumn. Mer information finns i Index på 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 UDT-kolumn, en kolumn av rumslig datatyp eller en hierarki-ID-datatypkolumn. Jämförelser med NULL
literaler tillåts inte med jämförelseoperatorerna. 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 UNIKA 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 ska mappas till. Partitionsschemat måste finnas i databasen genom att antingen köra CREATE PARTITION SCHEME eller ALTER PARTITION SCHEME. column_name anger den kolumn som ett partitionerat index ska partitioneras mot. 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 finns 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 standard i den här kontexten är inte ett nyckelord. Det är en identifierare för standardfilgruppen och måste avgränsas, som i ON "default"
eller ON [default]
. Om "standard" anges måste alternativet QUOTED_IDENTIFIER vara PÅ för den aktuella sessionen. Det här är standardinställningen. Mer information finns i SET QUOTED_IDENTIFIER.
Not
"default" anger inte databasens standardfilgrupp i kontexten för CREATE INDEX
. Detta skiljer sig från CREATE TABLE
, där "standard" hittar 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.
Vyn måste definieras med SCHEMABINDING för att skapa ett index på den. Ett unikt grupperat index måste skapas i en vy innan ett icke-grupperat index skapas. Mer information om indexerade vyer finns i avsnittet Anmärkningar.
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 den aktuella databasen eller database_name är tempdb
och object_name börjar med #.
<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 fillfactor- tillämpas på sidorna på mellannivå i indexet.
AV- eller fillfactor- har inte angetts
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.
Alternativet PAD_INDEX
är bara användbart när FILLFACTOR har angetts, eftersom PAD_INDEX
använder procentandelen 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 minimivärdet. Antalet rader på en mellanliggande indexsida är aldrig mindre än två, oavsett hur lågt värdet för fillfactor.
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. Värdet för fillfactor 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 använder du fill_factor
i sys.indexes
.
Viktig
Att skapa ett grupperat index med en FILLFACTOR
mindre än 100 påverkar mängden lagringsutrymme som data upptar eftersom databasmotorn omdistribuerar data när det skapar det klustrade indexet.
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 PÅ, oavsett vilket alternativ som anges om inte återskapande av index används.
PÅ
Mellanliggande sorteringsresultat som används för att skapa indexet lagras i tempdb. Detta kan minska tiden som krävs för att skapa ett index om tempdb finns på en annan uppsättning diskar än användardatabasen. 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 måste tempdb ha ungefär samma mängd extra utrymme för att lagra mellanliggande sorteringsresultat. Mer information finns i SORT_IN_TEMPDB alternativ 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 visas när dubbletter av nyckelvärden infogas i ett unikt index. Endast de rader som bryter mot unikhetsbegränsningen misslyckas.
BORT
Ett felmeddelande visas när dubbletter av nyckelvärden infogas i ett unikt index. Hela INSERT-åtgärden återställs.
IGNORE_DUP_KEY
kan inte anges till PÅ för index som skapats i en vy, icke-unika index, XML-index, rumsliga index och filtrerade index.
Om du vill visa IGNORE_DUP_KEY
använder du sys.indexes.
I bakåtkompatibel syntax motsvarar WITH IGNORE_DUP_KEY
WITH IGNORE_DUP_KEY = ON
.
STATISTICS_NORECOMPUTE = { ON | OFF}
Anger om distributionsstatistiken 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.
Viktig
Om du inaktiverar automatisk omkomputation av distributionsstatistik kan det hindra frågeoptimeraren från att välja optimala körningsplaner för frågor som involverar tabellen.
I bakåtkompatibel syntax motsvarar WITH STATISTICS_NORECOMPUTE
WITH STATISTICS_NORECOMPUTE = ON
.
STATISTICS_INCREMENTAL = { ON | AV }
gäller för: SQL Server (från och med SQL Server 2014 (12.x)) och Azure SQL Database
När ONär den statistik som skapas per partitionsstatistik. När OFFtas 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 för följande statistiktyper:
- 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 IS-lås (Intent Share) 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 lås (S) på källobjektet under en mycket kort tidsperiod. I slutet av åtgärden hämtas ett S-lås (delat) på källan under en kort tidsperiod om ett icke-grupperat index skapas. Ett lås för Sch-M (schemaändring) hämtas när ett klustrat index skapas eller tas bort online och när ett grupperat eller icke-grupperat index återskapas. ONLINE kan inte anges till PÅ när ett index skapas i en lokal tillfällig tabell.
Not
Skapande av onlineindex kan ange low_priority_lock_wait
alternativ, se 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 grupperat index, å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 ett delat lås (S) i tabellen. Detta förhindrar uppdateringar av den underliggande tabellen men tillåter läsåtgärder, till exempel SELECT-instruktioner.
Mer information finns i Utföra indexåtgärder online.
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 kolumnlagringsindex i SQL Server 2017 (14.x)) och äldre
- Icke-grupperade kolumnlagringsindex i SQL Server 2016 (13.x)) och äldre
- 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)) och Azure SQL Database, när en tabell innehåller varchar(max) eller varbinary(max) kolumner, kan ett klustrat index som innehåller andra kolumner skapas eller återskapas med hjälp av alternativet
ONLINE
. - Icke-grupperade index i en tabell med ett grupperat columnstore-index
Mer information finns i How Online Index Operations Work.
RESUMABLE = { ON | AV }
gäller för: SQL Server (från och med SQL Server 2019 (15.x)) och Azure SQL Database
Anger om en onlineindexåtgärd kan återupptas.
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 (från och med SQL Server 2019 (15.x)) och Azure SQL Database
Anger tid (ett heltalsvärde som anges i minuter) att en återupptabar onlineindexåtgärd körs innan den pausas.
Viktig
Mer detaljerad information om indexåtgärder som kan utföras online finns i Riktlinjer för onlineindexåtgärder.
Not
Återskapade onlineindex stöds inte i kolumnlagringsindex eller inaktiverade index.
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 (från och med SQL Server 2019 (15.x)) och Azure SQL Database
Anger om du vill optimera för att infoga konkurrens på sista sidan eller inte. Standardvärdet är OFF. Mer information finns i avsnittet sekventiella nycklar.
MAXDOP = max_degree_of_parallelism
Åsidosätter maximal grad av parallellitet konfigurationsalternativ under indexåtgärdens varaktighet. Mer information finns i Konfigurera den maximala graden av parallellitet serverkonfigurationsalternativ. Använd MAXDOP för att begränsa antalet processorer som används i en parallell plankörning. Maximalt är 64 processorer.
max_degree_of_parallelism kan vara:
1
Undertrycker parallell plangenerering.
>1
Begränsar det maximala antalet processorer som används i en parallell indexåtgärd till det angivna antalet eller färre baserat på den aktuella systemarbetsbelastningen.
0 (standard)
Använder det faktiska antalet processorer eller färre 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.
RAD
Index eller angivna partitioner komprimeras med hjälp av radkomprimering.
SIDA
Index eller angivna partitioner komprimeras med hjälp av sidkomprimering.
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.
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 ordet 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
Instruktionen CREATE INDEX
är optimerad som andra frågor. Om du vill spara på I/O-åtgärder kan frågeprocessorn 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 med flera processorer kan CREATE INDEX
använda fler processorer för att utföra de 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.
Den CREATE INDEX
åtgärden kan loggas minimalt 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 sessionen slutar tas indexen bort.
Ett grupperat index kan byggas på en tabellvariabel när en primärnyckel skapas. När frågan är klar eller sessionen avslutas tas indexet 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 Create Clustered Indexes and the SQL Server Index Architecture and Design Guide.
Icke-grupperade index
Från och med SQL Server 2016 (13.x) och i Azure SQL Database 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 klustrat index sparas 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.
Begränsningar och begränsningar:
- 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 duplicerade värden varje gång data läggs till av infogningsåtgärder. Infogningsåtgärder som skulle generera duplicerade nyckelvärden återställs och databasmotorn visar ett felmeddelande. Detta gäller även om infogningsåtgärden ändrar många rader men bara orsakar en dubblett. Om ett försök görs att ange data för vilka det finns ett unikt index och IGNORE_DUP_KEY
-satsen är inställd på PÅ, misslyckas endast de rader 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 överstiger 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 och arkitektur och designguide för SQL Server-index.
I SQL Server skapas inte statistik genom att genomsöka alla rader i tabellen när ett partitionerat index skapas eller återskapas. I stället använder frågeoptimeraren standardsamplingsalgoritmen för att generera statistik. 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
SET-alternativen i kolumnen Obligatoriskt värde krävs när något av följande villkor inträffar:
Skapa ett filtrerat index.
Åtgärden INSERT, UPDATE, DELETE eller MERGE ändrar data i ett filtrerat index.
Det filtrerade indexet används av frågeoptimeraren för att skapa frågeplanen.
SET-alternativ Obligatoriskt värde Standardservervärde Standard
OLE DB- och ODBC-värdeStandard
DB-Library värdeANSI_NULLS PÅ PÅ PÅ BORT ANSI_PADDING PÅ PÅ PÅ BORT ANSI_WARNINGS* PÅ PÅ PÅ BORT ARITHABORT PÅ PÅ BORT BORT CONCAT_NULL_YIELDS_NULL PÅ PÅ PÅ BORT NUMERIC_ROUNDABORT BORT BORT BORT BORT QUOTED_IDENTIFIER PÅ PÅ PÅ BORT - Om du anger ANSI_WARNINGS till ON anges implicit ARITHABORT till PÅ när databaskompatibilitetsnivån är inställd på 90 eller högre. Om databaskompatibilitetsnivån är inställd på 80 eller tidigare måste alternativet ARITHABORT uttryckligen anges till PÅ.
Om SET-alternativen är felaktiga kan följande villkor inträffa:
- Det filtrerade indexet skapas inte.
- Databasmotorn genererar ett fel och återställer INSERT-, UPDATE-, DELETE- eller MERGE-instruktioner 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 CREATE SPATIAL INDEX and Spatial Indexes Overview.
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 på 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 dock. 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 på en varchar kolumn och befintliga data finns i IN_ROW_DATA allokeringsenhet misslyckas efterföljande infognings- eller uppdateringsåtgärder i kolumnen som skulle skicka data utanför raden.
Icke-grupperade index kan innehålla icke-nyckelkolumner 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 egenskapen PERSISTED 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 UPPSÄTTNINGsalternativ för filtrerade index.
Begränsningen UNIK eller PRIMÄR NYCKEL 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 aritmetikfel. I följande tabell fungerar insert-instruktionen, även om den beräknade kolumnen c
resulterar i ett aritmetikfel.
CREATE TABLE t1 (a INT, b INT, c AS a/b);
INSERT INTO t1 VALUES (1, 0);
Om du i stället efter att ha skapat tabellen skapar ett index för den beräknade kolumnen c
kommer samma INSERT
-instruktion nu att misslyckas.
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 på 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 hitta all nödvändig information från en indexgenomsö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 ändrar även hur alternativ anges. I bakåtkompatibel syntax motsvarar WITH option_name
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 tillämpar 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änsning 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 de icke-grupperade index som tidigare var justerade med det klustrade indexet kanske inte längre är i linje med det. Mer information om partitionerad indexjustering finns i Partitionerade tabeller och index.
Satsen DROP_EXISTING
sorterar inte data igen om samma indexnyckelkolumner används i samma ordning och med samma stigande eller fallande ordning, såvida inte indexinstruktionen anger ett icke-grupperat index och onlinealternativet är inställt på OFF. Om det klustrade indexet är inaktiverat måste den CREATE INDEX WITH DROP_EXISTING
åtgärden utföras med ONLINE inställt på AV. 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å AV eller PÅ.
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.
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 alternativet
low_priority_lock_wait
argument kan du bestämma hur indexåtgärden kan fortsätta när den blockeras i Sch-M låset.
Mer information finns i Utföra indexåtgärder online.
Resurser
Följande resurser krävs för att återuppta åtgärden för att skapa onlineindex:
- Ytterligare utrymme krävs för att behålla indexet som skapas, inklusive den tid då index 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.
- Ett DDL-tillstånd som förhindrar DDL-ändringar
- Ghost-rensning blockeras i det inbyggda indexet under åtgärdens varaktighet både när åtgärden pausas och medan åtgärden körs.
Aktuella funktionsbegränsningar
Följande funktioner är inaktiverade för åtgärder för att återskapa indexskapande:
När en återupptabar onlineindexskapandeåtgärd har pausats kan det ursprungliga värdet för MAXDOP inte ändras
Skapa ett index som innehåller:
- Beräknade kolumner eller TIMESTAMP-kolumner som nyckelkolumner
- LOB-kolumn som inkluderad kolumn för att återuppta indexskapande
- Filtrerat index
Återupptabara indexåtgärder
gäller för: SQL Server (från och med SQL Server 2019 (15.x)) och Azure SQL Database
Följande riktlinjer gäller för återupptabara indexåtgärder:
- Onlineindexskapande anges som återupptabart med hjälp av alternativet
RESUMABLE = ON
. - Alternativet RESUMABLE sparas inte i metadata för ett visst index och gäller endast varaktigheten för en aktuell DDL-instruktion. Därför måste
RESUMABLE = ON
-satsen anges uttryckligen för att möjliggöra återupptagande. -
MAX_DURATION
alternativet stöds endast förRESUMABLE = ON
alternativet. -
MAX_DURATION
för alternativet RESUMABLE anger tidsintervallet för ett index som skapas. När den här gången används pausas indexversionen eller så slutförs körningen. Användaren bestämmer när en version för ett pausat index kan återupptas. Den tiden i minuter förMAX_DURATION
måste vara större än 0 minuter och mindre eller lika med en vecka (7 * 24 * 60 = 10080 minuter). Att ha en lång paus för en indexåtgärd kan påverka DML-prestanda för en specifik tabell samt databasdiskkapaciteten eftersom båda indexerar den ursprungliga och den nyligen skapade kräver diskutrymme och måste uppdateras under DML-åtgärder. OmMAX_DURATION
alternativet utelämnas fortsätter indexåtgärden tills det har slutförts eller tills ett fel inträffar. - Om du vill pausa indexåtgärden direkt kan du stoppa (Ctrl-C) det pågående kommandot, köra kommandot ALTER INDEX PAUSE eller köra kommandot
KILL <session_id>
. När kommandot har pausats kan det återupptas med kommandot ALTER INDEX. - Om du kör den ursprungliga
CREATE INDEX
-instruktionen för återupptar du automatiskt en pausad indexskapandeåtgärd. - Alternativet
SORT_IN_TEMPDB = ON
stöds inte för återupptabart index. - DDL-kommandot med
RESUMABLE = ON
kan inte köras i en explicit transaktion (kan inte ingå i börjanTRAN ... COMMIT
block). - Om du vill återuppta/avbryta ett indexskapande/återskapande använder du syntaxen ALTER INDEX T-SQL.
- Inaktiverade index stöds inte.
Not
DDL-kommandot körs tills det har slutförts, pausar eller misslyckas. Om kommandot pausas utfärdas ett fel som anger att åtgärden har pausats och att indexet inte har skapats. Mer information om aktuell indexstatus finns i sys.index_resumable_operations. Som tidigare i händelse av ett fel utfärdas även ett fel.
Information om att en indexskapande körs som en återupptabar åtgärd och för att kontrollera dess aktuella körningstillstånd läser du sys.index_resumable_operations.
WAIT_AT_LOW_PRIORITY med onlineindexåtgärder
gäller för: Den här syntaxen för CREATE INDEX
gäller för närvarande endast för SQL Server 2022 (16.x), Azure SQL Database och Azure SQL Managed Instance. För ALTER INDEX
gäller den här syntaxen för SQL Server (från och med SQL Server 2014 (12.x)) och Azure SQL Database. Mer information finns i ALTER INDEX.
Med syntaxen low_priority_lock_wait
kan du ange WAIT_AT_LOW_PRIORITY
beteende.
WAIT_AT_LOW_PRIORITY
kan endast användas med ONLINE=ON
.
Med WAIT_AT_LOW_PRIORITY
alternativet kan dbas hantera de Sch-S och Sch-M lås som krävs för att skapa onlineindex och gör att de kan välja något av tre alternativ. Om det under väntetiden MAX_DURATION = n [minutes]
i alla tre fall inte finns några blockerande aktiviteter, körs återskapande av onlineindex omedelbart utan att vänta och DDL-instruktionen har slutförts.
WAIT_AT_LOW_PRIORITY
anger att åtgärden för att skapa onlineindex väntar på lås med låg prioritet, vilket gör att andra åtgärder kan fortsätta medan onlineindexet byggs. 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 [MINUTER]
Väntetiden (ett heltalsvärde som anges i minuter) som onlineindexet skapar lås väntar med låg prioritet när DDL-kommandot körs. 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 MINUTER kan utelämnas.
ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]
NONE Fortsätt att vänta på låset med normal (vanlig) prioritet.
SELF Avsluta onlineindexet skapa DDL-åtgärden som körs för närvarande, utan att vidta några åtgärder. Alternativet SELF- kan inte användas med en MAX_DURATION
på 0.
BLOCKERS Avliva alla användartransaktioner som blockerar DDL-åtgärden för onlineindexet så att åtgärden kan fortsätta. Alternativet BLOCKERS kräver att inloggningen har ALTER ANY CONNECTION
behörighet.
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.
Sekventiella nycklar
gäller för: SQL Server (från och med SQL Server 2019 (15.x)) och Azure SQL Database
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å PAGELATCH_EX för sidan i fråga.
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.
Visa indexinformation
Om du vill returnera information om index kan du använda katalogvyer, systemfunktioner och system lagrade procedurer.
Datakomprimering
Datakomprimering beskrivs i avsnittet Datakomprimering. Följande är viktiga saker att tänka på:
- 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.
Följande begränsningar gäller för partitionerade index:
- Du kan inte ändra komprimeringsinställningen för en enskild partition om tabellen har icke-berättigade index.
- Syntaxen
ALTER INDEX <index> ... REBUILD PARTITION ...
återskapar den angivna partitionen av indexet. - Syntaxen
ALTER INDEX <index> ... REBUILD WITH ...
återskapar alla partitioner av indexet.
Om du vill utvärdera hur ändring av komprimeringstillståndet påverkar 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 samma överväganden 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 frågar du kolumnen
xml_compression
isys.partitions
katalogvyn.
Behörigheter
Kräver ALTER
behörighet i tabellen eller vyn eller medlemskapet i den db_ddladmin
fasta databasrollen.
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
SQL Database stöder inte filgrupps- och filströmsalternativ.
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 (från och med SQL Server 2019 (15.x)) och Azure SQL Database
-- 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 (från och med SQL Server 2019 (15.x)) och Azure SQL Database
-- 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);
Se även
- 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