Dela via


Riktlinjer för onlineindexåtgärder

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

När du utför onlineindexåtgärder gäller följande riktlinjer:

  • Klustrade index måste skapas, återskapas eller tas bort offline när den underliggande tabellen innehåller följande stora objektdatatyper (LOB): bild, ntextoch text.
  • Icke-unika, icke-klustrade index kan skapas online när tabellen har kolumner som använder LOB-datatyperna, men ingen av dessa kolumner används som nyckel eller inkluderade kolumner i indexdefinitionen.
  • Index på lokala temporära tabeller kan inte skapas, återskapas eller tas bort online. Den här begränsningen gäller inte för index i globala temporära tabeller.
  • Du kan starta en onlineindexåtgärd som en återupptabar åtgärd med hjälp av RESUMABLE-satsen i CREATE INDEX eller ALTER INDEX. En återupptabar indexåtgärd kan startas om efter ett oväntat fel, databasredundans eller ett ALTER INDEX PAUSE kommando och fortsätta där den avbröts.

Not

Onlineindexåtgärder är inte tillgängliga i varje version 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.

I följande tabell visas de indexåtgärder som kan utföras online, de index som exkluderas från dessa onlineåtgärder och de indexbegränsningar som kan återupptas. Ytterligare begränsningar ingår också.

Online-indexåtgärd Exkluderade index Andra begränsningar
ALTER INDEX REBUILD Inaktiverat grupperat index eller inaktiverad indexerad vy

XML-index

Index i en lokal temporär tabell
Om du anger nyckelordet ALL kan åtgärden misslyckas när tabellen innehåller ett exkluderat index.

Ytterligare begränsningar för återskapande av inaktiverade index gäller. Mer information finns i Inaktivera index och begränsningar.
CREATE INDEX XML index

Inledande unikt klustrat index på en vy

Index i en lokal temporär tabell
CREATE INDEX WITH DROP_EXISTING Inaktiverat grupperat index eller inaktiverad indexerad vy

Index i en lokal temporär tabell

XML-index
DROP INDEX Inaktiverat index

XML index

Icke-grupperat index

Index i en lokal temporär tabell
Det går inte att ange flera index i en enda instruktion.
ALTER TABLE ADD CONSTRAINT (PRIMARY KEY eller UNIQUE) Index i en lokal temporär tabell

Klustrat index
Endast en underklausul tillåts i taget. Du kan till exempel inte lägga till och släppa PRIMARY KEY eller UNIQUE begränsningar i samma ALTER TABLE-instruktion.
ALTER TABLE DROP CONSTRAINT (PRIMARY KEY eller UNIQUE) Klustrerad index

Den underliggande tabellen kan inte ändras, trunkeras eller tas bort när en onlineindexåtgärd pågår.

Onlinealternativinställningen (ON eller OFF) som anges när du skapar eller släpper ett grupperat index tillämpas på alla icke-grupperade index som måste återskapas. Om det klustrade indexet till exempel skapas online med hjälp av CREATE INDEX WITH DROP_EXISTING, ONLINE=ONåterskapas även alla associerade icke-grupperade index online.

När du skapar eller återskapar ett UNIQUE index online kan indexverktyget och en samtidig användartransaktion försöka infoga samma nyckel, vilket bryter mot unikheten. Om en rad som anges av en användare infogas i det nya indexet (målet) innan den ursprungliga raden från källtabellen flyttas till det nya indexet, misslyckas onlineindexåtgärden.

Även om det inte är vanligt kan onlineindexåtgärden orsaka ett dödläge när den interagerar med databasuppdateringar på grund av användar- eller programaktiviteter. I dessa sällsynta fall utses användar- eller applikationsaktiviteten som ett dödlägesoffer.

Du kan utföra samtidiga DDL-operationer för onlineindex på samma tabell eller vy endast när du skapar flera nya icke-klustrade index eller omorganiserar icke-klustrade index. Alla andra onlineindexåtgärder som utförs samtidigt misslyckas. Du kan till exempel inte skapa ett nytt index online när du återskapar ett befintligt index online i samma tabell.

Det går inte att utföra en onlineåtgärd när ett index innehåller en kolumn av den stora objekttypen och samma transaktion gör dataändringar innan onlineindexåtgärden startar. Du kan undvika det här problemet genom att flytta onlineindexåtgärden utanför transaktionen eller flytta den innan du ändrar data i samma transaktion.

Överväganden för diskutrymme

Onlineindexåtgärder kräver mer diskutrymme än offlineindexåtgärder.

  • När indexet skapas och indexet återskapas krävs ytterligare utrymme för det index som skapas (eller återskapas). Vanligtvis är detta ytterligare utrymme detsamma som det aktuella utrymmet som används av indexet, men det kan vara större eller mindre beroende på komprimering som används i det aktuella eller återskapade indexet.
  • Dessutom krävs diskutrymme för det tillfälliga mappningsindexet. Det här tillfälliga indexet används i onlineindexåtgärder som skapar, återskapar eller släpper ett grupperat index.
  • Att släppa ett grupperat index online kräver lika mycket utrymme som att skapa (eller återskapa) ett grupperat index online.

Mer information finns i Diskutrymmeskrav för index-DDL-åtgärder.

Prestandaöverväganden

Även om onlineindexåtgärder tillåter samtidig användaruppdateringsaktivitet kan indexåtgärderna ta längre tid om uppdateringsaktiviteten är tung. Normalt är onlineindexåtgärder långsammare än motsvarande offlineindexåtgärder, oavsett aktivitetsnivå för samtidig uppdatering.

Eftersom både käll- och målstrukturerna underhålls under onlineindexåtgärden ökar resursanvändningen för transaktioner för infoga, uppdatera och ta bort, vilket potentiellt fördubblas. Detta kan orsaka sämre prestanda och större resursanvändning, särskilt CPU-tid, under indexåtgärden. Onlineindexåtgärder loggas fullständigt.

Även om vi rekommenderar onlineåtgärder bör du utvärdera din miljö och specifika krav. Det kan vara optimalt att köra indexåtgärder offline. På så sätt begränsas användaråtkomsten till data under åtgärden, men åtgärden avslutas snabbare och använder färre resurser.

På datorer med flera processorer som kör SQL Server 2016 (13.x) och senare versioner kan indexåtgärder använda parallellitet för att utföra de genomsöknings- och sorteringsåtgärder som är associerade med index-instruktionen. Du kan använda alternativet MAXDOP index för att styra graden av parallellitet för onlineindexåtgärden. På så sätt kan du balansera de resurser som används av indexåtgärden med resurser för samtidiga användare. Mer information finns i Konfigurera parallella indexåtgärder. Mer information om utgåvor av SQL Server som stöder parallella indexåtgärder finns i Utgåvor och funktioner som stöds i SQL Server 2022.

Eftersom ett delat lås (S) eller ett schemaändringslås (Sch-M) hålls i den sista fasen av indexåtgärden bör du vara försiktig när du kör en onlineindexåtgärd i en explicit användartransaktion, till exempel BEGIN TRANSACTION ... COMMIT block. Detta gör att låsen hålls kvar till slutet av transaktionen, vilket kan blockera andra arbetsbelastningar.

Om indexsidelås inaktiveras med ALLOW_PAGE_LOCKS=OFFkan online ombyggnad av index öka indexfragmenteringen när den utförs med MAXDOP som är större än 1. Mer information finns i Så här fungerar det: Onlineindex-återuppbyggnad – kan orsaka ökad fragmentering.

Överväganden för transaktionslogg

Storskaliga indexåtgärder som utförs offline eller online kan generera stora mängder transaktionsloggar. Det beror på att både offline- och online-indexåtgärder är fullständigt loggade. För att säkerställa att indexåtgärden kan återställas kan transaktionsloggen inte trunkeras förrän indexåtgärden har slutförts. Loggen kan dock säkerhetskopieras under indexåtgärden.

Därför måste transaktionsloggen ha tillräckligt med utrymme för att lagra både indexåtgärdstransaktionerna och eventuella samtidiga användartransaktioner under indexåtgärden. Mer information finns i Diskutrymme för transaktionsloggar för indexåtgärder.

Onlineindexåtgärder orsakar inte hög transaktionsloggtillväxt om accelererad databasåterställning (ADR) är aktiverad.

Beständiga överväganden för versionsarkiv

Om ADR är aktiverat kan du skapa eller återskapa ett stort index online avsevärt öka storleken på det beständiga versionsarkivet (PVS) medan indexåtgärden pågår. Se till att databasen har tillräckligt med ledigt utrymme för att PVS ska växa. Mer information finns i Övervaka och felsöka accelererad databasåterställning.

Indexöverväganden som kan återupptas

Alternativet RESUMABLE index för CREATE INDEX och ALTER INDEX gäller för SQL Server (ALTER INDEX från och med SQL Server 2017 (14.x) och CREATE INDEX från och med SQL Server 2019 (15.x)), Azure SQL Database och Azure SQL Managed Instance. Mer information finns i CREATE INDEX and ALTER INDEX.

Om du vill använda alternativet RESUMABLE måste du också använda alternativet ONLINE. När du skapar eller återskapar index som kan återupptas gäller följande riktlinjer:

  • Du har bättre kontroll över att hantera, planera och utöka indexunderhållsperioder. Du kan pausa och starta om en indexskapa- eller indexåterskapaåtgärd flera gånger för att passa in i dina underhållsfönster.
  • Du kan återställa från fel vid indexskapande eller återskapande (till exempel databasredundans eller slut på diskutrymme) utan att behöva starta om indexåtgärden från början.
  • När en indexåtgärd har pausats kräver både det ursprungliga indexet och det nyligen skapade diskutrymmet och måste uppdateras under DML-åtgärderna.
  • Alternativet SORT_IN_TEMPDB=ON stöds inte.
  • Inaktiverade index stöds inte.

Tips

Återtagningsbara indexåtgärder kräver inte en stor transaktion, vilket tillåter frekvent loggtrunkering under den här åtgärden och undviker stor loggtillväxt. De data som krävs för att återuppta och slutföra en indexåtgärd lagras i datafilerna i en databas.

I allmänhet finns det ingen prestandaskillnad mellan återupptagbara och icke-återupptagbara onlineindexoperationer. För återupptabara CREATE INDEXfinns det ett konstant omkostnader som kan orsaka märkbart långsammare åtgärder för mindre tabeller.

När en återupptabar indexåtgärd har pausats:

  • För mestadels läsarbetsbelastningar är prestandaförsämringen obetydlig.
  • För uppdateringstunga arbetsbelastningar kan du uppleva viss försämring av genomströmningen beroende på arbetsbelastningens specifika detaljer.

I allmänhet finns det ingen skillnad i defragmenteringskvalitet mellan återupptagningsbar och icke-återupptagningsbar skapande av onlineindex eller återuppbyggnad.

Not

Medan en onlineindexåtgärd pausas misslyckas alla transaktioner som kräver ett exklusivt lås på tabellnivå (X) på tabellen som innehåller det pausade indexet. Detta kan till exempel inträffa med INSERT ... WITH (TABLOCK) operationer. I det här fallet får du fel 10637:

Cannot perform this operation on '<object name>' with ID (<object ID>) as one or more indexes are currently in resumable index rebuild state. Please refer to sys.index_resumable_operations for more details.

Lös fel 10637 genom att ta bort TABLOCK-indikationen från din transaktion, eller återuppta indexåtgärden och vänta tills den har slutförts innan du försöker utföra transaktionen igen.

Standardalternativ online

Du kan ange online- och återupptabara indexåtgärder som standardalternativ på databasnivå genom att ange ELEVATE_ONLINE eller ELEVATE_RESUMABLE databasomfattande konfigurationer. Med dessa standardalternativ kan du undvika att oavsiktligt starta en offlineindexåtgärd som gör en tabell eller ett index otillgängligt när den körs. Båda alternativen gör att databasmotorn automatiskt höjer nivån på vissa indexåtgärder till online- eller återupptagbar exekvering.

Du kan ange antingen alternativet som FAIL_UNSUPPORTED, WHEN_SUPPORTEDeller OFF. Du kan ange olika värden för ELEVATE_ONLINE och ELEVATE_RESUMABLE. Mer information finns i ALTER DATABASE SCOPED CONFIGURATION.

Både ELEVATE_ONLINE och ELEVATE_RESUMABLE gäller endast för DDL-instruktioner som stöder onlinesyntaxen respektive den återanvändbara syntaxen. Om du till exempel försöker skapa ett XML-index med ELEVATE_ONLINE=FAIL_UNSUPPORTEDkörs åtgärden offline eftersom XML-index inte stöder alternativet ONLINE. Alternativen påverkar endast DDL-instruktioner som skickas utan att ange ett ONLINE eller RESUMABLE alternativ. Genom att till exempel lämna in en instruktion med ONLINE=OFF eller RESUMABLE=OFFkan användaren åsidosätta en FAIL_UNSUPPORTED-inställning och köra en instruktion offline och/eller utan möjlighet att återuppta.

Not

ELEVATE_ONLINE och ELEVATE_RESUMABLE gäller inte för XML-indexåtgärder.