Resolve index fragmentation by reorganizing or rebuilding indexes

  • 03/19/2020
  • 21 minutes to read
    • p
    • j
    • M
    • M
    • d
    • +11

Applies to: Jastandard Server (alle understøttede versioner) Jastandard database Jastandard instance Jastandard Synapse Analytics japarallel datalager

denne artikel beskriver, hvordan indeksdefragmentering forekommer og diskuterer dens indvirkning på forespørgselsydelse. Når du har bestemt mængden af fragmentering, der findes for et indeks, kan du defragmentere et indeks ved enten at omorganisere et indeks eller genopbygge et indeks ved at køre Transaktionskommandoer i dit valgte værktøj eller ved hjælp af Microsoft Server Management Studio.

oversigt over Indeksfragmentering

hvad er indeksfragmentering, og hvorfor skal jeg bekymre mig om det:

  • fragmentering findes, når indekser har sider, hvor den logiske rækkefølge i indekset, baseret på indeksets nøgleværdi, ikke svarer til den fysiske rækkefølge inde i indekssiderne.
  • databasemotoren ændrer automatisk indekser, når der indsættes, opdateres eller slettes handlinger til de underliggende data. Tilføjelsen af rækker i en tabel kan f.eks. medføre, at eksisterende sider i indeksene opdeles, så der er plads til indsættelse af nye nøgleværdier. Over tid kan disse ændringer få oplysningerne i indekset til at blive spredt i databasen (fragmenteret). Fragmentering eksisterer, når indekser har sider, hvor den logiske rækkefølge, baseret på nøgleværdien, ikke svarer til den fysiske rækkefølge inde i datafilen.
  • stærkt fragmenterede indekser kan forringe forespørgselsydelsen, fordi der kræves yderligere I/O for at lokalisere data, som indekset peger på. Mere I / O får din applikation til at reagere langsomt, især når scanningsoperationer er involveret.

detektering af mængden af fragmentering

det første trin i beslutningen om, hvilken indeksdefragmenteringsmetode der skal bruges, er at analysere indekset for at bestemme graden af fragmentering. Du registrerer fragmentering forskelligt for indeksindekser og indeksindekser.

Bemærk

det er især vigtigt at gennemgå indeks eller bunke fragmentering efter store mængder data er slettet. For dynger, hvis der er hyppige opdateringer, kan det også være nødvendigt at gennemgå fragmentering for at undgå spredning af videresendelsesposter. For mere information om dynger, se dynger (tabeller uden grupperede indekser).

detektering af fragmentering af rækkehusindekser

Ved hjælp af sys.du kan registrere fragmentering i et bestemt indeks, alle indekser på en tabel eller indekseret visning, alle indekser i en database eller alle indekser i alle databaser. For partitionerede indekser giver sys.dm_db_fysical_stats også fragmenteringsoplysninger for hver partition.

resultatsættet returneret af sys. dm_db_indeks_physical_stats indeholder følgende kolonner:

kolonne Description
avg_fragmentation_in_percent procentdelen af logisk fragmentering (out-of-order sider i indekset).
fragment_count antallet af fragmenter (fysisk på hinanden følgende bladsider) i indekset.
avg_fragment_størrelses_in_pages gennemsnitligt antal sider i et fragment i et indeks.

når graden af fragmentering er kendt, skal du bruge følgende tabel til at bestemme den bedste metode til at fjerne fragmenteringen: indeks reorganisere eller indeks.

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 REORGANIZEog ALTER INDEX REBUILD. De faktiske værdier kan dog variere fra sag til sag. Det er vigtigt, at du eksperimenterer for at bestemme den bedste tærskel for dit miljø.

Tip

hvis et givet indeks for eksempel hovedsageligt bruges til scanningsoperationer, kan fjernelse af fragmentering forbedre ydeevnen for disse operationer. Ydelsesfordelen er muligvis ikke mærkbar for indekser, der primært bruges til seek-operationer.på samme måde er fjernelse af fragmentering i en bunke (en tabel uden grupperet indeks) især nyttig til ikke-lukkede indeksscanningsoperationer, men har ringe effekt i opslagsoperationer.

2 genopbygning af et indeks kan udføres online eller offline. Reorganisering af et indeks udføres altid online. For at opnå tilgængelighed svarende til omorganiseringsindstillingen skal du genopbygge indekser online. Du kan finde flere oplysninger i indeks og udføre Indekshandlinger online.

indekser med fragmentering på mindre end 5 procent behøver ikke at blive defragmenteret, fordi fordelen ved at fjerne en så lille mængde fragmentering næsten altid opvejes meget af CPU-omkostningerne for at omorganisere eller genopbygge indekset. Desuden reducerer genopbygning eller omorganisering af små rækkeindekser generelt ikke den faktiske fragmentering.Op til og med Server 2014 (12.Serverdatabasemotoren tildeler plads ved hjælp af blandede omfang. Derfor gemmes sider med små indekser undertiden i blandede omfang. Blandede udvidelser deles af op til otte objekter, så fragmenteringen i et lille indeks reduceres muligvis ikke efter omorganisering eller genopbygning af det. Se også overvejelser, der er specifikke for genopbygning af rækkeindekser. Du kan finde flere oplysninger om udvidelser i vejledningen til arkitektur for sider og udvidelser.

detektering af fragmentering af columnstore-indekser

ved at bruge sys.dm_db_column_store_group_physical_stats kan du bestemme procentdelen af slettede rækker i et indeks, hvilket er et rimeligt mål for fragmentering i en rækkegruppe af et columnstore-indeks. Brug disse oplysninger til at beregne fragmenteringen i et bestemt indeks, alle indekser på en tabel, alle indekser i en database eller alle indekser i alle databaser.

resultatsættet returneret af sys.dm_db_column_store_group_physical_stats indeholder følgende kolonner:

kolonne beskrivelse
total_rækker antal rækker fysisk gemt i rækkegruppen. For komprimerede rækkegrupper inkluderer dette de rækker, der er markeret som slettet.
Antal rækker, der fysisk er gemt i en komprimeret rækkegruppe, der er markeret til sletning. 0 for rækkegrupper, der er i delta store.

Brug disse oplysninger, der returneres til beregning af indeksfragmentering ved hjælp af denne formel:

100*(ISNULL(deleted_rows,0))/NULLIF(total_rows,0)

når graden af indeksfragmentering er kendt, skal du bruge følgende tabel til at bestemme den bedste metode til at fjerne fragmenteringen: INDEKSFRAGMENTERING eller indeks.

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. ændre indeks reorganisere

for at kontrollere fragmenteringen af et rækkehusindeks ved hjælp af Transact-KVL

følgende eksempel finder den gennemsnitlige fragmenteringsprocent af alle indekser i HumanResources.Employee tabel i AdventureWorks2016 database.

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

den forrige sætning returnerer et resultatsæt svarende til følgende.

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)

For mere information, se sys.

for at kontrollere fragmenteringen af et columnstore-indeks ved hjælp af Transact-SDL

følgende eksempel finder den gennemsnitlige fragmenteringsprocent af alle indekser i dbo.FactResellerSalesXL_CCI tabellen i AdventureWorksDW2016 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;

den forrige sætning returnerer et resultatsæt svarende til følgende.

object_id TableName index_id IndexName Fragmentation----------- --------------------------- ----------- ------------------------------- ---------------114099447 FactResellerSalesXL_CCI 1 IndFactResellerSalesXL_CCI 0(1 row(s) affected)

kontroller indeksfragmentering ved hjælp af SDR Server Management Studio

Bemærk

Management Studio kan ikke bruges til at beregne fragmentering af columnstore-indekser i Sdr-serveren og kan ikke bruges til at beregne fragmentering af indekser i Sdr-databasen. Brug det foregående eksempel.

  1. i Objektstifinder skal du udvide databasen, der indeholder den tabel, som du vil kontrollere et indekss fragmentering på.
  2. Udvid mappen tabeller.
  3. Udvid den tabel, hvor du vil kontrollere et indekss fragmentering.
  4. Udvid mappen indekser.
  5. Højreklik på det indeks, som du vil kontrollere fragmenteringen af, og vælg Egenskaber.
  6. vælg fragmentering under Vælg en side.

følgende oplysninger er tilgængelige på Fragmenteringssiden:

værdi beskrivelse
sidefyldhed angiver gennemsnitlig fylde på indekssiderne i procent. 100% betyder, at indekssiderne er helt fulde. 50% betyder, at hver indeksside i gennemsnit er halvt fyldt.
Total fragmentering den logiske fragmenteringsprocent. Dette angiver antallet af sider i et indeks, der ikke er gemt i rækkefølge.
gennemsnitlig rækkestørrelse den gennemsnitlige størrelse af en række på bladniveau.
dybde antallet af niveauer i indekset, herunder bladniveauet.
videresendte poster antallet af poster i en bunke, der har fremadrettede henvisninger til en anden dataplacering. (Denne tilstand opstår under en opdatering, når der ikke er plads nok til at gemme den nye række på den oprindelige placering.)
Spøgelsesrækker antallet af rækker, der er markeret som slettet, men endnu ikke fjernet. Disse rækker fjernes med en oprydningstråd, når serveren ikke er optaget. Denne værdi inkluderer ikke rækker, der bevares på grund af en udestående snapshot-isolationstransaktion.
indekstype typen af indeks. Mulige værdier er grupperet indeks,nonclustered indeks og primær. Tabeller kan også gemmes som en bunke (uden indekser), men så kan denne Indeksegenskabsside ikke åbnes.
rækker på Bladniveau antallet af rækker på bladniveau.
maksimal rækkestørrelse den maksimale rækkestørrelse på bladniveau.
mindste rækkestørrelse mindste rækkestørrelse på bladniveau.
sider det samlede antal datasider.
Partition ID partition ID for B-træet, der indeholder indekset.
Version ghost rækker antallet af ghost records, der bevares på grund af en fremragende snapshot isolation transaktion.

defragmentering af indekser ved at genopbygge eller omorganisere indekset

du defragmenterer et fragmenteret indeks ved hjælp af en af følgende metoder:

  • Indeksomlægning
  • indeksomlægning

Bemærk

for partitionerede indekser, der er bygget på et partitionsskema, kan du bruge en af følgende metoder på et komplet indeks eller en enkelt partition af et indeks.

omorganisere et indeks

omorganisering af et indeks bruger minimale systemressourcer og er en online operation. Dette betyder, at langsigtede blokerende tabellåse ikke holdes, og forespørgsler eller opdateringer til den underliggende tabel kan fortsætte under ALTER INDEX REORGANIZE – transaktionen.

  • databasemotoren defragmenterer bladniveauet for grupperede og ikke-lukkede indekser på tabeller og visninger ved fysisk at omarrangere bladniveausiderne for at matche den logiske rækkefølge af bladknudepunkterne (venstre mod højre). Omorganisering komprimerer også indekssiderne baseret på indeksets udfyldningsfaktorværdi. Brug sys for at se udfyldningsfaktorindstillingen.indeks. For syntakseksempler, se eksempler: Rokstore reorganisere.

  • Når du bruger columnstore-indekser, kan delta store ende med flere små rækkegrupper efter indsættelse, opdatering og sletning af data over tid. Reorganisering af et columnstore-indeks tvinger alle rækkegrupperne ind i columnstore og kombinerer derefter rækkegrupperne i færre rækkegrupper med flere rækker. Den reorganisere operation fjerner også rækker, der er blevet slettet fra columnstore. Omorganisering kræver oprindeligt yderligere CPU-ressourcer til at komprimere dataene, hvilket kan bremse den samlede systemydelse. Men så snart dataene er komprimeret, forbedres forespørgselsydelsen. For syntaks eksempler, se eksempler: ColumnStore reorganisere.

Genopbyg et indeks

genopbygning af et indeks falder og genopretter indekset. Afhængigt af typen af indeks-og Databasemotorversion kan en genopbygningsoperation udføres online eller offline. Se alter indeks Genbyg

  • for indeksindekser fjerner genopbygning fragmentering, genvinder diskplads ved at komprimere siderne baseret på den angivne eller eksisterende udfyldningsfaktorindstilling og omarrangerer indeksrækkerne i sammenhængende sider. Når ALL er angivet, falder alle indekser på bordet og genopbygges i en enkelt transaktion. Udenlandske nøglebegrænsninger behøver ikke at blive droppet på forhånd. Når indekser med 128 udvidelser eller mere genopbygges, udskyder databasemotoren de faktiske sideallokeringer og deres tilknyttede låse, indtil efter transaktionen forpligter sig. For syntakseksempler, se eksempler: Rokstore reorganisere.

  • for columnstore-indekser fjerner genopbygning fragmentering, flytter alle rækker ind i columnstore og genvinder diskplads ved fysisk at slette rækker, der logisk er slettet fra tabellen.

    Tip

    begynder med Server 2016 (13.er normalt ikke nødvendigt, da REORGANIZE udfører det væsentlige ved en genopbygning i baggrunden som en online operation.

    for syntakseksempler, se eksempler: ColumnStore rebuild.

tilladelser

kræverALTER tilladelse på bordet eller visning. Brugeren skal være medlem af mindst en af følgende roller:

  • db_ddladmin database rolle 1
  • db_ejer database rolle
  • sysadmin server rolle

1db_ddladmin database rolle er den mindst privilegerede.

Fjern fragmentering ved hjælp af Server Management Studio

for at omorganisere eller genopbygge et indeks

  1. i Objektstifinder skal du udvide databasen, der indeholder den tabel, som du vil omorganisere et indeks på.
  2. Udvid mappen tabeller.
  3. Udvid den tabel, som du vil omorganisere et indeks på.
  4. Udvid mappen indekser.
  5. Højreklik på det indeks, du vil omorganisere, og vælg omorganisere.
  6. i dialogboksen omorganisere indekser skal du kontrollere, at det korrekte indeks er i gitteret indekser, der skal omorganiseres, og klikke på OK.
  7. Marker afkrydsningsfeltet Compact large object column data for at angive, at alle sider, der indeholder LOB-data (large object), også komprimeres.
  8. Klik på OK.

hvis du vil omorganisere alle indekser i en tabel

  1. i Objektstifinder, skal du udvide databasen, der indeholder den tabel, som du vil omorganisere indekserne på.
  2. Udvid mappen tabeller.
  3. Udvid tabellen, som du vil omorganisere indekserne på.
  4. Højreklik på mappen indekser, og vælg omorganisere alle.
  5. i dialogboksen omorganisere indekser skal du kontrollere, at de korrekte indekser er i de indekser, der skal omorganiseres. Hvis du vil fjerne et indeks fra de indekser, der skal omorganiseres, skal du vælge indekset og derefter trykke på Delete-tasten.
  6. Marker afkrydsningsfeltet Compact large object column data for at angive, at alle sider, der indeholder LOB-data (large object), også komprimeres.
  7. Klik på OK.

hvis du vil genopbygge et indeks

  1. i Objektstifinder, skal du udvide databasen, der indeholder den tabel, som du vil omorganisere et indeks på.
  2. Udvid mappen tabeller.
  3. Udvid den tabel, som du vil omorganisere et indeks på.
  4. Udvid mappen indekser.
  5. Højreklik på det indeks, du vil omorganisere, og vælg Genopbyg.
  6. i dialogboksen Genopbyg indekser skal du kontrollere, at det korrekte indeks er i gitteret indekser, der skal genopbygges, og klikke på OK.
  7. Marker afkrydsningsfeltet Compact large object column data for at angive, at alle sider, der indeholder LOB-data (large object), også komprimeres.
  8. Klik på OK.

Fjern fragmentering ved hjælp af transaktionsindeks

Bemærk

for flere eksempler på brug af transaktionsindeks til genopbygning eller omorganisering af indekser, se eksempler på ALTER-indeks: Kolonnestore-indekser og eksempler på ALTER-indekser: Rækkestore-indekser.

for at omorganisere et fragmenteret indeks

følgende eksempel omorganiserer IX_Employee_OrganizationalLevel_OrganizationalNodeindekset på HumanResources.Employeetabellen i AdventureWorks2016 databasen.

ALTER INDEX IX_Employee_OrganizationalLevel_OrganizationalNode ON HumanResources.Employee REORGANIZE;

følgende eksempel reorganisererIndFactResellerSalesXL_CCIcolumnstore indeks pådbo.FactResellerSalesXL_CCItabellen iAdventureWorksDW2016 database.

-- 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);

for at omorganisere alle indekser i en tabel

følgende eksempel omorganiserer alle indekser påHumanResources.Employeetabellen iAdventureWorks2016 databasen.

ALTER INDEX ALL ON HumanResources.Employee REORGANIZE;

for at genopbygge et fragmenteret indeks

følgende eksempel genopbygger et enkelt indeks påEmployeetabellen iAdventureWorks2016 databasen.

ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.EmployeeREBUILD;

for at genopbygge alle indekser i en tabel

følgende eksempel genopbygger alle indekser, der er knyttet til tabellen iAdventureWorks2016 database ved hjælp afALL søgeord. Tre muligheder er angivet.

ALTER INDEX ALL ON Production.ProductREBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON);

For mere information, se ændre indeks.

automatisk indeks-og statistikstyring

Udnyt løsninger såsom adaptiv Indeksdefragmentering til automatisk styring af indeksdefragmentering og statistikopdateringer til en eller flere databaser. Denne procedure vælger automatisk, om et indeks skal genopbygges eller omorganiseres i henhold til dets fragmenteringsniveau, blandt andre parametre, og opdatere statistikker med en lineær tærskel.

overvejelser, der er specifikke for genopbygning af indeksindekser

genopbygning af et grupperet indeks genopbygger automatisk ethvert ikke-lukket indeks, der refererer til klyngenøglen, hvis de fysiske eller logiske identifikatorer indeholdt i de ikke-lukkede indeksregistreringer skal ændres.

følgende scenarier tvinger alle ikke-lukkede indekser på et bord til automatisk at blive genopbygget:

  • oprettelse af et grupperet indeks på en tabel
  • fjernelse af et grupperet indeks, hvilket får tabellen til at blive gemt som en bunke
  • ændring af klyngetasten til at inkludere eller ekskludere kolonner

følgende scenarier kræver ikke, at alle ikke-grupperede indekser automatisk genopbygges på en tabel:

  • genopbygning af et unikt grupperet indeks
  • genopbygning af et ikke-unikt grupperet indeks
  • ændring af indeksskemaet, såsom anvendelse af et partitioneringsskema på et grupperet indeks eller flytning af det grupperede indeks til en anden filgruppe

vigtigt

et indeks kan ikke omorganiseres eller genopbygges, hvis den filgruppe, hvori den er placeret, er offline eller indstillet til skrivebeskyttet. Når nøgleordet All er angivet, og et eller flere indekser er i en offline-eller skrivebeskyttet filgruppe, mislykkes udsagnet.

mens der opstår en indeksgenopbygning, skal de fysiske medier have plads nok til at gemme to kopier af indekset. Når genopbygningen er færdig, sletter databasemotoren det oprindelige indeks.

nårALL er angivet medALTER INDEX erklæring, relationelle indekser, både grupperet og ikke-clustered, og HML indekser på bordet er reorganiseret.

overvejelser, der er specifikke for genopbygning af et columnstore-indeks

Når du genopbygger et columnstore-indeks, læser databasemotoren alle data fra det originale columnstore-indeks, inklusive delta store. Det kombinerer dataene i nye rækkegrupper og komprimerer rækkegrupperne i columnstore. Databasemotoren defragmenterer columnstore ved fysisk at slette rækker, der er logisk slettet fra tabellen. De slettede bytes genvindes på disken.

Bemærk

omorganisering af et columnstore-indeks ved hjælp af Management Studio kombinerer komprimerede rækkegrupper sammen, men tvinger ikke alle rækkegrupper til at blive komprimeret til columnstore. Lukkede rækkegrupper komprimeres, men åbne rækkegrupper komprimeres ikke i columnstore.To Komprimer alle rækkegrupper med magt, brug eksemplet Transact-kvm nedenfor.

Bemærk

begyndende med server 2019 (15.tuple-mover hjælpes af en baggrundsfletningsopgave, der automatisk komprimerer mindre åbne delta-rækkegrupper, der har eksisteret i nogen tid som bestemt af en intern tærskel, eller fletter komprimerede rækkegrupper, hvorfra et stort antal rækker er blevet slettet. Dette forbedrer columnstore-indekskvaliteten over tid.
For mere information om columnstore vilkår og begreber, se Columnstore indekser: oversigt.

Genopbyg en partition i stedet for hele tabellen

  • genopbygning af hele tabellen tager lang tid, hvis indekset er stort, og det kræver nok diskplads til at gemme en ekstra kopi af indekset under genopbygningen. Normalt er det kun nødvendigt at genopbygge den senest anvendte partition.
  • for partitionerede tabeller behøver du ikke at genopbygge hele columnstore-indekset, fordi fragmentering sandsynligvis kun forekommer i de partitioner, der er blevet ændret for nylig. Faktatabeller og store dimensionstabeller er normalt opdelt for at udføre backup-og styringsoperationer på bidder af tabellen.

Genopbyg en partition efter tunge DML-operationer

genopbygning af en partition defragmenterer partitionen og reducerer disklagring. Ombygning sletter alle rækker fra columnstore, der er markeret til sletning, og flytter alle rækkegrupper fra delta store til columnstore. Der kan være flere rækkegrupper i delta-butikken, der har mindre end en million rækker.

Genopbyg en partition efter indlæsning af data

genopbygning af en partition efter indlæsningsdato sikrer, at alle data gemmes i columnstore. Når samtidige processer hver belastning mindre end 100.000 rækker i den samme partition på samme tid, kan partitionen ende med flere delta-butikker. Genopbygning flytter alle delta store rækker ind i columnstore.

overvejelser, der er specifikke for omorganisering af et columnstore-indeks

Når du omorganiserer et columnstore-indeks, komprimerer databasemotoren hver lukket delta-rækkegruppe i columnstore som en komprimeret rækkegruppe. Start med Server 2016 (13.kommandoenREORGANIZE udfører følgende yderligere defragmenteringsoptimeringer online:

  • fjerner fysisk rækker fra en rækkegruppe, når 10% eller mere af rækkerne er blevet logisk slettet. De slettede bytes genvindes på de fysiske medier. Hvis en komprimeret rækkegruppe på 1 million rækker f.eks. har slettet 100k rækker, fjerner vi de slettede rækker og komprimerer rækkegruppen igen med 900K rækker. Det sparer på lageret ved at fjerne slettede rækker.

  • kombinerer en eller flere komprimerede rækkegrupper for at øge rækker pr.rækkegruppe op til maksimalt 1.048.576 rækker. Hvis du f.eks. masseimporterer 5 batcher på 102.400 rækker, får du 5 komprimerede rækkegrupper. Hvis du kører reorganisere, vil disse rækkegrupper blive flettet i 1 komprimeret rækkegruppe af størrelse 512.000 rækker. Dette forudsætter, at der ikke var nogen ordbogsstørrelse eller hukommelsesbegrænsninger.

  • for rækkegrupper, hvor 10% eller flere af rækkerne logisk er blevet slettet, forsøger databasemotoren at kombinere denne rækkegruppe med en eller flere rækkegrupper. For eksempel komprimeres rækkegruppe 1 med 500.000 rækker, og rækkegruppe 21 komprimeres med maksimalt 1.048.576 rækker. Rækkegruppe 21 har 60% af rækkerne slettet, hvilket efterlader 409.830 rækker. Databasemotoren foretrækker at kombinere disse to rækkegrupper for at komprimere en ny rækkegruppe, der har 909.830 rækker.

Når du har udført dataindlæsninger, kan du have flere små rækkegrupper i delta store. Du kan bruge ALTER INDEX REORGANIZE til at tvinge alle rækkegrupperne ind i kolonnenstore og derefter kombinere rækkegrupperne i færre rækkegrupper med flere rækker. Den reorganisere operation vil også fjerne rækker, der er blevet slettet fra columnstore.

begrænsninger og begrænsninger

Rækkehusindekser med mere end 128 udvidelser genopbygges i to separate faser: logisk og fysisk. I den logiske fase markeres de eksisterende tildelingsenheder, der bruges af indekset, til deallokering, datarækkerne kopieres og sorteres og flyttes derefter til nye tildelingsenheder, der er oprettet for at gemme det genopbyggede indeks. I den fysiske fase falder de tildelingsenheder, der tidligere er markeret til deallokering, fysisk i korte transaktioner, der sker i baggrunden, og kræver ikke mange låse. Du kan finde flere oplysninger om udvidelser i Vejledning til arkitektur i sider og udvidelser.

ALTER INDEX REORGANIZE erklæringen kræver, at datafilen, der indeholder indekset, har plads til rådighed, fordi handlingen kun kan allokere midlertidige arbejdssider på den samme fil, ikke i en anden fil inden for filgruppen. Så selvom filgruppen muligvis har gratis sider tilgængelige, kan brugeren stadig støde på fejl 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.

advarsel

oprettelse og genopbygning af ikke-justerede indekser på en tabel med mere end 1.000 partitioner er mulig, men understøttes ikke. Dette kan medføre forringet ydeevne eller for stort hukommelsesforbrug under disse operationer. Microsoft anbefaler kun at bruge justerede indekser, når antallet af partitioner overstiger 1.000.

et indeks kan ikke omorganiseres eller genopbygges, hvis den filgruppe, hvori den er placeret, er offline eller indstillet til skrivebeskyttet. Når nøgleordet ALL er angivet, og et eller flere indekser er i en offline-eller skrivebeskyttet filgruppe, mislykkes udsagnet.

statistik:

  • når et indeks oprettes eller genopbygges, oprettes eller opdateres statistikker ved at scanne alle rækkerne i tabellen. Start dog med Server 2012 (11.statistik oprettes eller opdateres ikke ved at scanne alle rækkerne i tabellen, når et partitioneret indeks oprettes eller genopbygges. I stedet bruger Forespørgselsoptimeringsværktøjet standardprøvetagningsalgoritmen til at generere disse statistikker. For at få statistik over partitionerede indekser ved at scanne alle rækkerne i tabellen skal du bruge Opret statistik eller opdater statistik med FULLSCAN klausul.

  • når et indeks omorganiseres, opdateres statistikken ikke.

et indeks kan ikke omorganiseres, nårALLOW_PAGE_LOCKS er indstillet til OFF.

op til server 2017 (14.at genopbygge et grupperet columnstore-indeks er en offline operation. Databasemotoren skal erhverve en eksklusiv lås på bordet eller partitionen, mens genopbygningen finder sted. Dataene er offline og utilgængelige under genopbygningen, selv når du bruger NOLOCK, Read-committed Snapshot Isolation (RCSI) eller Snapshot Isolation.Start med server 2019 (15.en grupperet columnstore indeks genopbygges ved hjælp af ONLINE = ON valgmulighed.

for en blå Synapsanalyse (tidligere Blå Synapsanalyse) tabel med et ordnet grupperet columnstore-indeks,ALTER INDEX REBUILD sorterer dataene igen ved hjælp af TempDB. Overvåg TempDB under genopbygningsoperationer. Hvis du har brug for mere TempDB-plads, skal du opskalere datalageret. Skal ned igen, når indekset genopbygges er afsluttet.

for en tabel med et ordnet grupperet columnstore-indeks,ALTER INDEX REORGANIZE sorterer ikke dataene igen. For at ty data brug ALTER INDEX REBUILD.

brug af INDEKSBYGNING til at gendanne fra udstyrsfejl

i tidligere versioner af kan du undertiden genopbygge et ikke-lukket indeks for at rette uoverensstemmelser forårsaget af udstyrsfejl.Fra og med Server 2008 kan du muligvis stadig reparere sådanne uoverensstemmelser mellem indekset og det grupperede indeks ved at genopbygge et ikke-lukket indeks offline. Du kan dog ikke reparere ikke-lukkede indeksukonsekvenser ved at genopbygge indekset online, fordi online-genopbygningsmekanismen bruger det eksisterende ikke-lukkede indeks som grundlag for genopbygningen og dermed fortsætter inkonsekvensen. Genopbygning af indekset offline kan undertiden tvinge en scanning af det grupperede indeks (eller bunke) og så fjerne inkonsekvensen. For at sikre en genopbygning fra det klyngede indeks, slip og genskab det ikke-lukkede indeks. Som med tidligere versioner anbefaler vi, at du gendanner uoverensstemmelser ved at gendanne de berørte data fra en sikkerhedskopi; du kan dog muligvis reparere indekskonsekvenserne ved at genopbygge det ikke-lukkede indeks offline. Du kan finde flere oplysninger i DBCC CHECKDB.

Se også

  • Udfør Indekshandlinger online
  • ALTER indeks (Transact)
  • adaptivt indeks Defrag
  • Opret statistik (Transact)
  • Opdater statistik (Transact)
  • Columnstore indekser Forespørgselsydelse
  • kom i gang med columnstore for realtids operationel analyse
  • columnstore indekser til datalagring
  • columnstore indekser og fletningspolitikken for rækkegrupper

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *