- 03/19/2020
- 21 minutes to read
-
- p
- j
- M
- M
- d
-
+11
Applies to: SQL Server (alla versioner som stöds) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics parallel data warehouse
den här artikeln beskrivs hur indexdefragmentering inträffar och diskuterar dess inverkan på frågans prestanda. När du har bestämt mängden fragmentering som finns för ett index kan du defragmentera ett index genom att antingen omorganisera ett index eller bygga om ett index genom att köra Transact-SQL-kommandon i ditt valverktyg eller genom att använda SQL Server Management Studio.
Indexfragmenteringsöversikt
vad är indexfragmentering och varför ska jag bry mig om det:
- fragmentering finns när index har sidor där den logiska ordningen inom indexet, baserat på indexets nyckelvärde, inte matchar den fysiska beställningen inuti indexsidorna.
- databasmotorn ändrar automatiskt index när infoga, uppdatera eller ta bort åtgärder görs till underliggande data. Till exempel kan tillägg av rader i en tabell leda till att befintliga sidor i rowstore-index delas upp för att göra plats för infogning av nya nyckelvärden. Med tiden kan dessa ändringar leda till att informationen i indexet sprids i databasen (fragmenterad). Fragmentering finns när index har sidor där den logiska ordningen, baserad på nyckelvärdet, inte matchar den fysiska beställningen i datafilen.
- kraftigt fragmenterade index kan försämra frågans prestanda eftersom ytterligare I / O krävs för att lokalisera data som indexet pekar på. Mer I / O gör att din applikation svarar långsamt, särskilt när skanningsoperationer är inblandade.
detektera mängden fragmentering
det första steget i att bestämma vilket indexdefragmenteringsmetod som ska användas är att analysera indexet för att bestämma graden av fragmentering. Du upptäcker fragmentering på olika sätt för rowstore index och columnstore index.
Obs
det är särskilt viktigt att granska index eller heap fragmentering efter stora mängder data raderas. För högar, om det finns frekventa uppdateringar, kan det också behövas för att granska fragmentering för att undvika spridning av vidarebefordringsposter. Mer information om högar finns i högar (tabeller utan grupperade index).
upptäcka fragmentering av rowstore index
med hjälp av sys.dm_db_index_physical_stats, du kan upptäcka fragmentering i ett specifikt index, alla index i en tabell eller indexerad vy, alla index i en databas eller alla index i alla databaser. För partitionerade index tillhandahåller sys.dm_db_index_physical_stats också fragmenteringsinformation för varje partition.
resultatuppsättningen som returneras av sys. dm_db_index_physical_stats innehåller följande kolumner:
kolumn | beskrivning |
---|---|
avg_fragmentation_in_percent | procent av logisk fragmentering (Out-of-order sidor i indexet). |
fragment_count | antalet fragment (fysiskt på varandra följande bladsidor) i indexet. |
avg_fragment_size_in_pages | Genomsnittligt antal sidor i ett fragment i ett index. |
när graden av fragmentering är känd, använd följande tabell för att bestämma den bästa metoden för att ta bort fragmenteringen: INDEX omorganisera eller INDEX.
avg_fragmentation_in_percent value | Corrective statement |
---|---|
> 5% and < = 30% 1 | ALTER INDEX REORGANIZE |
> 30% 1 | ALTER INDEX REBUILD WITH (ONLINE = ON) 2 |
1 These values provide a rough guideline for determining the point at which you should switch between ALTER INDEX REORGANIZE
och ALTER INDEX REBUILD
. De faktiska värdena kan dock variera från fall till fall. Det är viktigt att du experimenterar för att bestämma den bästa tröskeln för din miljö.
tips
om ett givet index till exempel används främst för skanningsoperationer kan borttagning av fragmentering förbättra prestanda för dessa operationer. Prestationsfördelen kanske inte märks för index som används främst för seek-operationer.
på samma sätt är borttagning av fragmentering i en hög (en tabell utan grupperat index) särskilt användbart för icke-klustrade indexskanningsoperationer, men har liten effekt vid uppslag.
2 ombyggnad av ett index kan utföras online eller offline. Omorganisering av ett index utförs alltid online. För att uppnå tillgänglighet som liknar alternativet omorganisera bör du bygga om index online. Mer information finns i INDEX och utför Indexoperationer Online.
Index med fragmentering på mindre än 5 procent behöver inte defragmenteras eftersom fördelen med att ta bort en så liten mängd fragmentering nästan alltid uppvägs mycket av CPU-kostnaden för att omorganisera eller bygga om indexet. Att bygga om eller omorganisera små rowstore-index minskar i allmänhet inte den faktiska fragmenteringen.Upp till och med SQL Server 2014 (12.x), SQL Server Database Engine allokerar utrymme med blandade utsträckning. Därför lagras sidor med små index ibland i blandade utsträckning. Blandade utsträckning delas av upp till åtta objekt, så fragmenteringen i ett litet index kanske inte minskas efter omorganisation eller ombyggnad av det. Se även överväganden som är specifika för att bygga om rowstore-index. För mer information om extents, se sidorna och Extents Architecture Guide.
upptäcka fragmentering av columnstore index
genom att använda sys.dm_db_column_store_row_group_physical_stats kan du bestämma procentandelen raderade rader i ett index, vilket är en rimlig åtgärd för fragmentering i en rodgrupp i ett columnstore-index. Använd den här informationen för att beräkna fragmenteringen i ett specifikt index, alla index i en tabell, alla index i en databas eller alla index i alla databaser.
resultatuppsättningen som returneras av sys.dm_db_column_store_row_group_physical_stats innehåller följande kolumner:
kolumn | beskrivning |
---|---|
total_rows | antal rader fysiskt lagrade i radgruppen. För komprimerade radgrupper inkluderar detta de rader som är markerade som raderade. |
deleted_rows | Antal rader som fysiskt lagras i en komprimerad radgrupp som är markerade för radering. 0 för radgrupper som finns i delta store. |
Använd denna information som returneras för att beräkna indexfragmentering med hjälp av denna formel:
100*(ISNULL(deleted_rows,0))/NULLIF(total_rows,0)
när graden av indexfragmentering är känd, använd följande tabell för att bestämma den bästa metoden för att ta bort fragmenteringen: INDEX omorganisera eller INDEX.
computed fragmentation in percent value | Applies to version | Corrective statement |
---|---|---|
> = 20% | SQL Server 2012 (11.x) and SQL Server 2014 (12.x) | ALTER INDEX REBUILD |
> = 20% | Starting with SQL Server 2016 (13.X) | ändra INDEX omorganisera |
för att kontrollera fragmenteringen av ett rowstore-index med Transact-SQL
följande exempel hittar den genomsnittliga fragmenteringsprocenten av alla index i HumanResources.Employee
tabell i databasen AdventureWorks2016
.
SELECT a.object_id, object_name(a.object_id) AS TableName, a.index_id, name AS IndedxName, avg_fragmentation_in_percentFROM sys.dm_db_index_physical_stats (DB_ID (N'AdventureWorks2016_EXT') , OBJECT_ID(N'HumanResources.Employee') , NULL , NULL , NULL) AS aINNER JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;GO
föregående uttalande returnerar en resultatuppsättning som liknar följande.
object_id TableName index_id IndexName avg_fragmentation_in_percent----------- ------------ ----------- ----------------------------------------------------- ------------------------------1557580587 Employee 1 PK_Employee_BusinessEntityID 01557580587 Employee 2 IX_Employee_OrganizationalNode 01557580587 Employee 3 IX_Employee_OrganizationalLevel_OrganizationalNode 01557580587 Employee 5 AK_Employee_LoginID 66.66666666666671557580587 Employee 6 AK_Employee_NationalIDNumber 501557580587 Employee 7 AK_Employee_rowguid 0(6 row(s) affected)
För mer information, se sys.dm_db_index_physical_stats.
för att kontrollera fragmenteringen av ett columnstore-index med Transact-SQL
i följande exempel hittar du den genomsnittliga fragmenteringsprocenten för alla index i dbo.FactResellerSalesXL_CCI
– tabellen iAdventureWorksDW2016
– databasen.
SELECT i.object_id, object_name(i.object_id) AS TableName, i.index_id, i.name AS IndexName, 100*(ISNULL(SUM(CSRowGroups.deleted_rows),0))/NULLIF(SUM(CSRowGroups.total_rows),0) AS 'Fragmentation'FROM sys.indexes AS i INNER JOIN sys.dm_db_column_store_row_group_physical_stats AS CSRowGroups ON i.object_id = CSRowGroups.object_id AND i.index_id = CSRowGroups.index_idWHERE object_name(i.object_id) = 'FactResellerSalesXL_CCI'GROUP BY i.object_id, i.index_id, i.nameORDER BY object_name(i.object_id), i.name;
föregående uttalande returnerar en resultatuppsättning som liknar följande.
object_id TableName index_id IndexName Fragmentation----------- --------------------------- ----------- ------------------------------- ---------------114099447 FactResellerSalesXL_CCI 1 IndFactResellerSalesXL_CCI 0(1 row(s) affected)
kontrollera indexfragmentering med SQL Server Management Studio
Obs
Management Studio kan inte användas för att beräkna fragmentering av columnstore index i SQL Server och kan inte användas för att beräkna fragmentering av index i Azure SQL Database. Använd föregående Transact-SQL-exempel.
- I Object Explorer utvidgar du databasen som innehåller tabellen där du vill kontrollera ett Indexs fragmentering.
- expandera mappen tabeller.
- expandera tabellen där du vill kontrollera ett Indexs fragmentering.
- expandera mappen index.
- högerklicka på indexet som du vill kontrollera fragmenteringen och välj Egenskaper.
- under Välj en sida väljer du fragmentering.
följande information finns på Fragmenteringssidan:
värde | beskrivning |
---|---|
sidans fullhet | indikerar Genomsnittlig fullhet av indexsidorna, i procent. 100% betyder att indexsidorna är helt fulla. 50% innebär att varje indexsida i genomsnitt är halvfull. |
Total fragmentering | den logiska fragmenteringsprocenten. Detta anger antalet sidor i ett index som inte lagras i ordning. |
Genomsnittlig radstorlek | den genomsnittliga storleken på en bladnivårad. |
djup | antalet nivåer i indexet, inklusive bladnivån. |
vidarebefordrade poster | antalet poster i en hög som har framåtpekare till en annan dataplats. (Detta tillstånd inträffar under en uppdatering, när det inte finns tillräckligt med utrymme för att lagra den nya raden på den ursprungliga platsen.) |
Spökrader | antalet rader som är markerade som borttagna men ännu inte borttagna. Dessa rader kommer att tas bort av en saneringstråd när servern inte är upptagen. Detta värde inkluderar inte rader som behålls på grund av en enastående transaktion för ögonblicksbildsisolering. |
Indextyp | typ av index. Möjliga värden är klustrade index, Nonclustered index och primär XML. Tabeller kan också lagras som en heap (utan index), men då kan inte denna Indexegenskapssida öppnas. |
bladnivårader | antalet bladnivårader. |
maximal radstorlek | den maximala radstorleken på bladnivå. |
minsta radstorlek | minsta radstorlek på bladnivå. |
sidor | det totala antalet datasidor. |
Partition ID | partitions-ID för B-trädet som innehåller indexet. |
version spökrader | antalet spökregister som behålls på grund av en enastående isoleringstransaktion för ögonblicksbilder. |
defragmentera index genom att bygga om eller omorganisera indexet
du defragmenterar ett fragmenterat index genom att använda någon av följande metoder:
- Index omorganisation
- index rebuild
Obs
för partitionerade index byggda på ett partitionsschema kan du använda någon av följande metoder på ett komplett index eller en enda partition i ett index.
omorganisera ett index
omorganisera ett index använder minimala systemresurser och är en online-operation. Detta innebär att långsiktiga blockeringsbordslås inte hålls och frågor eller uppdateringar till den underliggande tabellen kan fortsätta under ALTER INDEX REORGANIZE
– transaktionen.
-
För rowstore index defragmenterar databasmotorn bladnivån för grupperade och icke-klustrade index på tabeller och vyer genom att fysiskt ordna bladnivåsidorna så att de matchar den logiska ordningen för bladnoderna (vänster till höger). Omorganisation komprimerar också indexsidorna baserat på indexets fyllningsfaktorvärde. Använd sys för att visa inställningen fyllfaktor.index. För syntaxexempel, se exempel: Rowstore omorganisera.
-
När du använder columnstore-index kan delta store sluta med flera små radgrupper efter att du har infogat, uppdaterat och raderat data över tiden. Omorganisering av ett kolumnstore-index tvingar alla radgrupper in i kolumnstore och kombinerar sedan radgrupperna till färre radgrupper med fler rader. Omorganisera-operationen tar också bort rader som har tagits bort från columnstore. Omorganisering kräver initialt ytterligare CPU-resurser för att komprimera data, vilket kan sakta ner systemets totala prestanda. Men så snart data komprimeras förbättras frågans prestanda. För syntaxexempel, se exempel: ColumnStore omorganisera.
återuppbygga ett index
återuppbygga ett index sjunker och återskapar indexet. Beroende på typ av index-och Databasmotorversion kan en ombyggnad göras online eller offline. För T-SQL-syntaxen, se ALTER INDEX REBUILD
-
För rowstore-index, ombyggnad tar bort fragmentering, återvinner diskutrymme genom att komprimera sidorna baserat på den angivna eller befintliga fyllfaktorinställningen och ordnar om indexraderna i angränsande sidor. När
ALL
anges, tappas alla index på bordet och byggs om i en enda transaktion. Utländska nyckelbegränsningar behöver inte släppas i förväg. När index med 128 extents eller mer återuppbyggs, skjuter databasmotorn upp de faktiska sidavdelningarna och deras tillhörande lås tills transaktionen har begåtts. För syntaxexempel, se exempel: Rowstore omorganisera. -
för columnstore-index tar ombyggnad bort fragmentering, flyttar alla rader till columnstore och återvinner diskutrymme genom att fysiskt radera rader som logiskt har raderats från tabellen.
tips
börjar med SQL Server 2016 (13.x), ombyggnad av columnstore-indexet behövs vanligtvis inte eftersom
REORGANIZE
utför det väsentliga i en ombyggnad i bakgrunden som en onlineoperation.för syntaxexempel, se exempel: ColumnStore rebuild.
behörigheter
kräverALTER
tillstånd på bordet eller vyn. Användaren måste vara medlem i minst en av följande roller:
- db_ddladmin databasroll 1
- db_owner databasroll
- sysadmin serverroll
1db_ddladmin databasroll är den minst privilegierade.
ta bort fragmentering med SQL Server Management Studio
om du vill omorganisera eller bygga om ett index
- I Object Explorer utvidgar du databasen som innehåller tabellen där du vill omorganisera ett index.
- expandera mappen tabeller.
- expandera tabellen där du vill omorganisera ett index.
- expandera mappen index.
- högerklicka på det index du vill omorganisera och välj omorganisera.
- i dialogrutan omorganisera index kontrollerar du att rätt index finns i rutnätet Index som ska omorganiseras och klickar på OK.
- markera kryssrutan Kompaktdata för stora objekt för att ange att alla sidor som innehåller LOB-data (large object) också är komprimerade.
- Klicka på OK.
om du vill omorganisera alla index i en tabell
- I Object Explorer utvidgar du databasen som innehåller tabellen där du vill omorganisera indexen.
- expandera mappen tabeller.
- expandera tabellen där du vill omorganisera indexen.
- högerklicka på mappen index och välj omorganisera alla.
- i dialogrutan omorganisera index kontrollerar du att rätt index finns i de Index som ska omorganiseras. Om du vill ta bort ett index från rutnätet Index som ska omorganiseras markerar du indexet och trycker sedan på Delete-tangenten.
- markera kryssrutan Kompaktdata för stora objekt för att ange att alla sidor som innehåller LOB-data (large object) också är komprimerade.
- Klicka på OK.
om du vill återskapa ett index
- I Object Explorer utvidgar du databasen som innehåller tabellen där du vill omorganisera ett index.
- expandera mappen tabeller.
- expandera tabellen där du vill omorganisera ett index.
- expandera mappen index.
- högerklicka på det index du vill omorganisera och välj Rebuild.
- i dialogrutan återuppbygga index kontrollerar du att rätt index finns i rutnätet Index som ska byggas om och klickar på OK.
- markera kryssrutan Kompaktdata för stora objekt för att ange att alla sidor som innehåller LOB-data (large object) också är komprimerade.
- Klicka på OK.
ta bort fragmentering med Transact-SQL
Obs
för fler exempel på hur du använder Transact-SQL för att bygga om eller omorganisera index, se ALTER INDEX exempel: Columnstore index och ALTER INDEX exempel: Rowstore index.
för att omorganisera ett fragmenterat index
följande exempel omorganiserarIX_Employee_OrganizationalLevel_OrganizationalNode
index påHumanResources.Employee
tabellen iAdventureWorks2016
databasen.
ALTER INDEX IX_Employee_OrganizationalLevel_OrganizationalNode ON HumanResources.Employee REORGANIZE;
följande exempel omorganiserarIndFactResellerSalesXL_CCI
kolumnstore index pådbo.FactResellerSalesXL_CCI
tabellen iAdventureWorksDW2016
databasen.
-- This command will force all CLOSED and OPEN rowgroups into the columnstore.ALTER INDEX IndFactResellerSalesXL_CCI ON FactResellerSalesXL_CCI REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);
om du vill omorganisera alla index i en tabell
i följande exempel omorganiseras alla index i databasen HumanResources.Employee
I AdventureWorks2016
.
ALTER INDEX ALL ON HumanResources.Employee REORGANIZE;
för att bygga om ett fragmenterat index
följande exempel bygger om ett enda index på Employee
– tabellen i AdventureWorks2016
– databasen.
ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.EmployeeREBUILD;
för att bygga om alla index i en tabell
följande exempel bygger om alla index som är associerade med tabellen iAdventureWorks2016
– databasen medALL
nyckelord. Tre alternativ anges.
ALTER INDEX ALL ON Production.ProductREBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON);
För mer information, se ALTER INDEX (Transact-SQL).
Automatisk index-och statistikhantering
utnyttja lösningar som Adaptive Index Defrag för att automatiskt hantera indexdefragmentering och statistikuppdateringar för en eller flera databaser. Denna procedur väljer automatiskt om man vill bygga om eller omorganisera ett index enligt dess fragmenteringsnivå, bland andra parametrar, och uppdatera statistik med en linjär tröskel.
överväganden som är specifika för ombyggnad av rowstore-index
ombyggnad av ett grupperat index återuppbygger automatiskt alla icke-klustrade index som refererar till klusternyckeln, om de fysiska eller logiska identifierarna i de icke-klustrade indexposterna behöver ändras.
följande scenarier tvingar alla rowstore nonclustered index på ett bord att automatiskt byggas om:
- skapa ett grupperat index på en tabell
- ta bort ett grupperat index, vilket gör att tabellen lagras som en heap
- ändra klusternyckeln för att inkludera eller utesluta kolumner
följande scenarier kräver inte att alla rowstore nonclustered index automatiskt byggs om på en tabell:
- återuppbygga ett unikt grupperat index
- återuppbygga ett icke-unikt grupperat index
- ändra indexschemat, till exempel att tillämpa ett partitioneringsschema på ett grupperat index eller flytta det grupperade indexet till en annan filgrupp
viktigt
ett index kan inte omorganiseras eller byggas om om filgruppen där den finns är offline eller inställd på skrivskyddad. När nyckelordet all anges och ett eller flera index finns i en offline-eller skrivskyddad filgrupp misslyckas uttalandet.
medan ett index återuppbyggs måste det fysiska mediet ha tillräckligt med utrymme för att lagra två kopior av indexet. När ombyggnaden är klar raderar databasmotorn det ursprungliga indexet.
NärALL
anges medALTER INDEX
uttalande, relationella index, både grupperade och icke-klustrade, och XML-index på tabellen omorganiseras.
överväganden som är specifika för att bygga om ett columnstore-index
När du bygger om ett columnstore-index läser databasmotorn all data från det ursprungliga columnstore-indexet, inklusive delta store. Den kombinerar data i nya radgrupper och komprimerar radgrupperna i kolumnstore. Databasmotorn defragmenterar columnstore genom att fysiskt radera rader som logiskt har raderats från tabellen. De borttagna byte återvinns på disken.
Obs
omorganisering av ett kolumnstore-index med Management Studio kombinerar komprimerade radgrupper tillsammans, men tvingar inte alla radgrupper att komprimeras till kolumnstore. Stängda radgrupper komprimeras men öppna radgrupper komprimeras inte i columnstore.To komprimera alla radgrupper med våld, använd Transact-SQL-exemplet nedan.
Obs
börjar med SQL Server 2019 (15.x), tuple-mover hjälpas av en bakgrundssammanfogningsuppgift som automatiskt komprimerar mindre öppna delta-radgrupper som har funnits under en tid som bestäms av en intern tröskel, eller sammanfogar komprimerade radgrupper från vilka ett stort antal rader har raderats. Detta förbättrar columnstore indexkvaliteten över tiden.
för mer information om columnstore termer och begrepp, se Columnstore index: översikt.
återuppbygga en partition istället för hela tabellen
- återuppbygga hela tabellen tar lång tid om indexet är stort och det kräver tillräckligt med diskutrymme för att lagra en extra kopia av indexet under ombyggnaden. Vanligtvis är det bara nödvändigt att bygga om den senast använda partitionen.
- för partitionerade tabeller behöver du inte bygga om hela columnstore-indexet eftersom fragmentering sannolikt kommer att uppstå i endast de partitioner som har ändrats nyligen. Faktatabeller och stora dimensionstabeller är vanligtvis partitionerade för att utföra säkerhetskopierings-och hanteringsoperationer på bitar av tabellen.
återuppbygga en partition efter tunga DML-operationer
återuppbygga en partition defragmenterar partitionen och minskar disklagring. Ombyggnad raderar alla rader från columnstore som är markerade för radering och flyttar alla radgrupper från delta store till columnstore. Det kan finnas flera radgrupper i delta store som har mindre än en miljon rader.
återuppbygga en partition efter laddning av data
återuppbygga en partition efter laddningsdatum säkerställer att all data lagras i columnstore. När samtidiga processer varje belastning mindre än 100.000 rader i samma partition samtidigt, partitionen kan sluta med flera delta butiker. Ombyggnad flyttar alla delta store rader i columnstore.
överväganden som är specifika för att omorganisera ett columnstore-index
När du omorganiserar ett columnstore-index komprimerar databasmotorn varje sluten delta-radgrupp till columnstore som en komprimerad radgrupp. Börjar med SQL Server 2016 (13.X) och i Azure SQL Database utför kommandot REORGANIZE
följande ytterligare defragmenteringsoptimeringar online:
-
tar fysiskt bort rader från en radgrupp när 10% eller fler av raderna logiskt har raderats. De borttagna byte återvinns på det fysiska mediet. Till exempel, om en komprimerad radgrupp på 1 miljon rader har 100k rader raderade, tar SQL Server bort de raderade raderna och komprimerar om radgruppen med 900k rader. Det sparar på lagringen genom att ta bort raderade rader.
-
kombinerar en eller flera komprimerade radgrupper för att öka rader per radgrupp upp till maximalt 1 048 576 rader. Om du till exempel importerar 5 satser med 102 400 rader får du 5 komprimerade radgrupper. Om du kör REORGANIZE kommer dessa radgrupper att slås samman till 1 komprimerad radgrupp med Storlek 512 000 rader. Detta förutsätter att det inte fanns någon ordbokstorlek eller minnesbegränsningar.
-
För radgrupper där 10% eller fler av raderna logiskt har raderats försöker databasmotorn kombinera denna radgrupp med en eller flera radgrupper. Till exempel komprimeras rowgroup 1 med 500 000 rader och rowgroup 21 komprimeras med maximalt 1 048 576 rader. Rowgroup 21 har 60% av raderna raderade vilket lämnar 409 830 rader. Databasmotorn gynnar att kombinera dessa två radgrupper för att komprimera en ny radgrupp som har 909 830 rader.
När du har utfört databelastningar kan du ha flera små radgrupper i delta store. Du kan använda ALTER INDEX REORGANIZE
för att tvinga alla radgrupper till kolumnstore och sedan kombinera radgrupperna till färre radgrupper med fler rader. Omorganisera-åtgärden tar också bort rader som har tagits bort från columnstore.
begränsningar och begränsningar
Rowstore index med mer än 128 omfattning byggs om i två separata faser: logisk och fysisk. I den logiska fasen markeras de befintliga tilldelningsenheterna som används av indexet för avfördelning, dataraderna kopieras och sorteras och flyttas sedan till nya tilldelningsenheter som skapats för att lagra det ombyggda indexet. I den fysiska fasen tappas de tilldelningsenheter som tidigare markerats för avfördelning fysiskt i korta transaktioner som händer i bakgrunden och kräver inte många lås. För mer information om extents, se sidor och Extents Architecture Guide.
ALTER INDEX REORGANIZE
– uttalandet kräver att datafilen som innehåller indexet har utrymme tillgängligt, eftersom åtgärden bara kan tilldela tillfälliga arbetssidor på samma fil, inte i en annan fil i filgruppen. Så även om filgruppen kan ha gratis sidor tillgängliga kan användaren fortfarande stöta på fel 1105: Could not allocate space for object '###' in database '###' because the '###' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup.
Varning
skapa och bygga om icke-anpassade index på ett bord med mer än 1000 partitioner är möjligt, men stöds inte. Om du gör det kan det orsaka försämrad prestanda eller överdriven minneskonsumtion under dessa operationer. Microsoft rekommenderar att du endast använder justerade index när antalet partitioner överstiger 1 000.
ett index kan inte omorganiseras eller byggas om om filgruppen där den finns är offline eller inställd på skrivskyddad. När nyckelordet ALL
anges och ett eller flera index finns i en offline-eller skrivskyddad filgrupp misslyckas uttalandet.
statistik:
-
När ett index skapas eller byggs om skapas eller uppdateras statistik genom att skanna alla rader i tabellen. Men börjar med SQL Server 2012 (11.X), statistik skapas eller uppdateras inte genom att skanna alla rader i tabellen när ett partitionerat index skapas eller byggs om. Istället använder Frågeoptimeraren standardprovtagningsalgoritmen för att generera denna statistik. För att få statistik över partitionerade index genom att skanna alla rader i tabellen, använd skapa statistik eller uppdatera statistik med
FULLSCAN
klausul. -
När ett index omorganiseras uppdateras inte statistiken.
ett index kan inte omorganiseras närALLOW_PAGE_LOCKS
är inställt på OFF.
upp till SQL Server 2017 (14.x), ombyggnad av ett grupperat kolumnstore-index är en offline-operation. Databasmotorn måste förvärva ett exklusivt lås på bordet eller partitionen medan ombyggnaden sker. Uppgifterna är offline och otillgängliga under ombyggnaden även när du använder NOLOCK
, Read-committed Snapshot Isolation (RCSI) eller Snapshot Isolation.Börjar med SQL Server 2019 (15.x) kan ett klustrat kolumnstore-index byggas om med alternativet ONLINE = ON
.
för en Azure Synapse Analytics-tabell (tidigare Azure Synapse Analytics) med ett ordnat grupperat kolumnstore-index sorterarALTER INDEX REBUILD
data igen med TempDB. Övervaka TempDB under ombyggnad. Om du behöver mer TempDB-utrymme, skala upp datalagret. Skala tillbaka när indexuppbyggnaden är klar.
för en Azure Synapse Analytics-tabell (tidigare Azure Synapse Analytics) med ett ordnat klustrat kolumnstore-index sorterar inte ALTER INDEX REORGANIZE
data igen. För att använda data använd ALTER INDEX REBUILD
.
använda INDEX REBUILD för att återhämta sig från hårdvarufel
i tidigare versioner av SQL Server kan du ibland bygga om ett rowstore nonclustered index för att korrigera inkonsekvenser orsakade av hårdvarufel.Från och med SQL Server 2008 kanske du fortfarande kan reparera sådana inkonsekvenser mellan indexet och det grupperade indexet genom att bygga om ett nonclustered index offline. Du kan dock inte reparera inkonsekvenser med icke-klustrade index genom att bygga om indexet online, eftersom återuppbyggnadsmekanismen OnLine använder det befintliga icke-klustrade indexet som grund för ombyggnaden och därmed kvarstår inkonsekvensen. Ombyggnad av indexet offline kan ibland tvinga en skanning av det grupperade indexet (eller högen) och så ta bort inkonsekvensen. För att säkerställa en ombyggnad från det grupperade indexet, släpp och återskapa det icke-klustrade indexet. Som med tidigare versioner rekommenderar vi att du återställer inkonsekvenser genom att återställa de drabbade data från en säkerhetskopia; du kanske dock kan reparera indexkonsekvenserna genom att bygga om det icke-klustrade indexet offline. Mer information finns i DBCC CHECKDB (Transact-SQL).
Se även
- SQL Server Index arkitektur och Design Guide
- utför Index operationer online
- ALTER INDEX (Transact-SQL)
- Adaptive Index Defrag
- skapa statistik (Transact-SQL)
- uppdatera statistik (Transact-SQL)
- Columnstore index Query Performance
- kom igång med Columnstore på riktigt-tid operativ analys
- columnstore index för datalagring
- columnstore index och Merge Policy för Rowgroups