- 03/19/2020
- 21 minutes to read
-
- p
- j
- M
- M
- d
-
+11
Applies to: SQL Server (alle ondersteunde versies) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Parallel Data Warehouse
Dit artikel beschrijft hoe index defragmentatie optreedt en bespreekt de impact ervan op de query-prestaties. Als u eenmaal hebt bepaald hoeveel fragmentatie er voor een index bestaat, kunt u een index defragmenteren door een index te reorganiseren of een index opnieuw op te bouwen door Transact-SQL-opdrachten uit te voeren in uw gereedschap naar keuze of door SQL Server Management Studio te gebruiken.
Index fragmentatie overzicht
Wat is index fragmentatie en waarom zou ik er om geven:
- fragmentatie bestaat wanneer indexen pagina ’s hebben waarin de logische volgorde binnen de index, gebaseerd op de sleutelwaarde van de index, niet overeenkomt met de fysieke volgorde binnen de indexpagina’ s.
- de Database-Engine wijzigt automatisch indexen wanneer bewerkingen invoegen, bijwerken of verwijderen worden uitgevoerd om de onderliggende gegevens. Bijvoorbeeld, de toevoeging van rijen in een tabel kan ervoor zorgen dat bestaande pagina ‘ s in rowstore indexen te splitsen om ruimte te maken voor het invoegen van nieuwe sleutelwaarden. Na verloop van tijd kunnen deze wijzigingen ertoe leiden dat de informatie in de index wordt verspreid in de database (gefragmenteerd). Fragmentatie bestaat wanneer indexen pagina ‘ s hebben waarin de logische volgorde, gebaseerd op de sleutelwaarde, niet overeenkomt met de fysieke volgorde in het gegevensbestand.
- sterk gefragmenteerde indexen kunnen query-prestaties degraderen omdat extra I / O nodig is om gegevens te lokaliseren waarnaar de index wijst. Meer I / O zorgt ervoor dat uw toepassing langzaam reageert, vooral wanneer scanbewerkingen betrokken zijn.
detecteren van de hoeveelheid fragmentatie
de eerste stap om te beslissen welke indexdefragmentatiemethode moet worden gebruikt, is het analyseren van de index om de mate van fragmentatie te bepalen. U detecteert fragmentatie anders voor rowstore indexen en columnstore indexen.
Note
Het is vooral belangrijk om index-of heapfragmentatie te bekijken nadat grote hoeveelheden gegevens zijn verwijderd. Voor hopen, als er frequente updates, kan het ook nodig zijn om fragmentatie te herzien om proliferatie van doorsturen records te voorkomen. Zie Heaps (tabellen zonder geclusterde indexen) voor meer informatie over heaps.
fragmentatie van rowstore indexen detecteren
met behulp van sys.dm_db_index_physical_stats, u kunt fragmentatie detecteren in een specifieke index, alle indexen op een tabel of geïndexeerde weergave, alle indexen in een database, of alle indexen in alle databases. Voor gepartitioneerde indexen biedt sys.dm_db_index_physical_stats ook fragmentatie-informatie voor elke partitie.
het resultaat dat door sys.dm_db_index_physical_stats wordt geretourneerd, bevat de volgende kolommen:
kolom | Description |
---|---|
avg_fragmentation_in_percentage | het percentage logische fragmentatie (pagina ‘ s in de index die niet in orde zijn). |
fragment_count | het aantal fragmenten (fysiek opeenvolgende bladpagina ‘ s) in de index. |
avg_fragment_size_in_pages | gemiddeld aantal pagina ‘ s in een fragment in een index. |
nadat de mate van fragmentatie bekend is, gebruik de volgende tabel om de beste methode te bepalen om de fragmentatie te verwijderen: INDEX reorganiseren of 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
en ALTER INDEX REBUILD
. De werkelijke waarden kunnen echter van geval tot geval verschillen. Het is belangrijk dat u experimenteert om de beste drempel voor uw omgeving te bepalen.
Tip
bijvoorbeeld, als een gegeven index voornamelijk wordt gebruikt voor scanbewerkingen, kan het verwijderen van fragmentatie de prestaties van deze bewerkingen verbeteren. Het prestatievoordeel is mogelijk niet merkbaar voor indexen die voornamelijk worden gebruikt voor zoekoperaties.
evenzo is het verwijderen van fragmentatie in een heap (een tabel zonder geclusterde index) vooral nuttig voor niet-geclusterde indexscanbewerkingen, maar heeft het weinig effect in lookupbewerkingen.
2 het opnieuw samenstellen van een index kan online of offline worden uitgevoerd. Het reorganiseren van een index wordt altijd online uitgevoerd. Om beschikbaarheid te bereiken die vergelijkbaar is met de optie reorganiseren, moet u indexen Online opnieuw opbouwen. Zie Index en Indexbewerkingen Online uitvoeren voor meer informatie.
indexen met fragmentatie van minder dan 5 procent hoeven niet gedefragmenteerd te worden omdat het voordeel van het verwijderen van zo ‘ n kleine hoeveelheid fragmentatie bijna altijd ruimschoots opweegt tegen de CPU-kosten die gemaakt zijn om de index te reorganiseren of opnieuw op te bouwen. Ook, herbouwen of reorganiseren van kleine rowstore indexen over het algemeen niet de werkelijke fragmentatie te verminderen.Tot en met SQL Server 2014 (12.x), de SQL Server Database Engine toewijst ruimte met behulp van gemengde extents. Daarom worden pagina ‘ s met kleine indexen soms opgeslagen op gemengde extensies. Gemengde extents worden gedeeld door maximaal acht objecten, dus de fragmentatie in een kleine index kan niet worden verminderd na het reorganiseren of opnieuw opbouwen. Zie ook overwegingen specifiek voor het herbouwen van rowstore indexen. Zie De Gids Pages and Extents Architecture voor meer informatie over extents.
fragmentatie van columnstore-indexen detecteren
met behulp van sys.dm_db_column_store_row_group_physical_stats kunt u het percentage verwijderde rijen in een index bepalen, wat een redelijke maat is voor fragmentatie in een rijgroep van een columnstore-index. Gebruik deze informatie om de fragmentatie te berekenen in een specifieke index, alle indexen op een tabel, alle indexen in een database, of alle indexen in alle databases.
De resultaatset van sys.dm_db_column_store_row_group_physical_stats bevat de volgende kolommen:
Kolom | Beschrijving |
---|---|
total_rows | Aantal rijen fysieke opgeslagen in de rij van de groep. Voor gecomprimeerde rijgroepen omvat dit de rijen die zijn gemarkeerd als verwijderd. |
deleted_rows | aantal rijen fysiek opgeslagen in een gecomprimeerde rijgroep die zijn gemarkeerd voor verwijdering. 0 voor rijgroepen die zich in het delta-archief bevinden. |
Gebruik deze informatie om indexfragmentatie te berekenen met behulp van deze formule:
100*(ISNULL(deleted_rows,0))/NULLIF(total_rows,0)
nadat de mate van indexfragmentatie bekend is, gebruik de volgende tabel om de beste methode te bepalen om de fragmentatie te verwijderen: INDEX reorganiseren of 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) | alter INDEX reorganiseren |
om de fragmentatie van een rowstore-index te controleren met behulp van Transact-SQL
het volgende voorbeeld vindt het gemiddelde fragmentatiepercentage van alle indexen in de HumanResources.Employee
tabel in deAdventureWorks2016
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
het vorige commando geeft een resultaatset terug die vergelijkbaar is met het volgende.
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)
voor meer informatie, zie sys.dm_db_index_physical_stats.
om de fragmentatie van een columnstore-index te controleren met behulp van Transact-SQL
het volgende voorbeeld vindt het gemiddelde fragmentatiepercentage van alle indexen in de dbo.FactResellerSalesXL_CCI
tabel in de AdventureWorksDW2016
database.
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;
het vorige commando geeft een resultaatset terug die vergelijkbaar is met het volgende.
object_id TableName index_id IndexName Fragmentation----------- --------------------------- ----------- ------------------------------- ---------------114099447 FactResellerSalesXL_CCI 1 IndFactResellerSalesXL_CCI 0(1 row(s) affected)
indexfragmentatie controleren met behulp van SQL Server Management Studio
Note
Management Studio kan niet worden gebruikt om fragmentatie van columnstore-indexen in SQL Server te berekenen en kan niet worden gebruikt om fragmentatie van indexen in de Azure SQL-Database te berekenen. Gebruik het voorgaande voorbeeld van Transact-SQL.
- vouw in Objectverkenner de database uit die de tabel bevat waarop u de fragmentatie van een index wilt controleren.
- vouw de map tabellen uit.
- vouw de tabel uit waarop u de fragmentatie van een index wilt controleren.
- vouw de map indexen uit.
- Klik met de rechtermuisknop op de index waarvan u de fragmentatie wilt controleren en selecteer Eigenschappen.
- selecteer fragmentatie onder Selecteer een pagina.
De volgende informatie is beschikbaar op de Fragmentatie pagina:
Waarde | Beschrijving |
---|---|
Pagina volheid | Geeft de gemiddelde volheid van de index pagina ‘ s als een percentage. 100% betekent dat de indexpagina ‘ s volledig vol zijn. 50% betekent dat elke indexpagina gemiddeld halfvol is. |
totale fragmentatie | het logische fragmentatiepercentage. Dit geeft aan hoeveel pagina ‘ s in een index niet op volgorde zijn opgeslagen. |
gemiddelde rijgrootte | de gemiddelde grootte van een rij op bladniveau. |
diepte | het aantal niveaus in de index, inclusief het bladniveau. |
Forwarded records | het aantal records in een heap dat vooruitwijzers naar een andere gegevenslocatie heeft. (Deze status treedt op tijdens een update, wanneer er niet genoeg ruimte is om de nieuwe rij op de oorspronkelijke locatie op te slaan.) |
Spookrijen | het aantal rijen dat is gemarkeerd als verwijderd maar nog niet verwijderd. Deze rijen worden verwijderd door een opschoon thread, wanneer de server niet bezet is. Deze waarde omvat geen rijen die worden behouden als gevolg van een uitstaande momentopname-isolatietransactie. |
indextype | het type index. Mogelijke waarden zijn geclusterde index, niet-geclusterde index en primaire XML. Tabellen kunnen ook worden opgeslagen als een heap (zonder indexen), maar dan kan deze index eigenschappen pagina niet worden geopend. |
rijen op Bladniveau | het aantal rijen op bladniveau. |
maximale rijgrootte | de maximale rijgrootte op bladniveau. |
minimale rijgrootte | de minimale rijgrootte op bladniveau. |
pagina ‘s | het totale aantal gegevenspagina’ s. |
partitie-ID | de partitie-ID van de B-boom die de index bevat. |
versie ghost rows | het aantal ghost records dat wordt bewaard als gevolg van een uitstaande snapshot-isolatietransactie. |
defragmenteren van indexen door de index
opnieuw op te bouwen of te reorganiseren defragmenteert u een gefragmenteerde index met behulp van een van de volgende methoden:
- index reorganisatie
- Index rebuild
Note
voor gepartitioneerde indexen gebouwd op een partitieschema, kunt u een van de volgende methoden gebruiken op een volledige index of een enkele partitie van een index.
een index reorganiseren
een index reorganiseren gebruikt minimale systeembronnen en is een online operatie. Dit betekent dat lange termijn blokkerende tabelsloten niet worden vastgehouden en query ‘ s of updates van de onderliggende tabel kunnen doorgaan tijdens de ALTER INDEX REORGANIZE
transactie.
-
voor rowstore-indexen defragmenteert de Database-Engine het bladniveau van geclusterde en niet-geclusterde indexen op tabellen en weergaven door de pagina ‘ s op bladniveau fysiek te herschikken naar de logische volgorde van de bladknopen (van links naar rechts). Reorganiseren comprimeert ook de indexpagina ‘ s op basis van de vulfactor waarde van de index. Gebruik sys om de vulfactor-instelling te bekijken.indexen. Voor syntaxisvoorbeelden, zie voorbeelden: rowstore reorganiseren.
-
wanneer columnstore-indexen worden gebruikt, kan de delta-opslag eindigen met meerdere kleine rowgroups na het invoegen, bijwerken en verwijderen van gegevens in de loop van de tijd. Het reorganiseren van een columnstore index forceert alle rowgroups in de columnstore en combineert de rowgroups in minder rowgroups met meer rijen. De reorganiseren operatie verwijdert ook rijen die zijn verwijderd uit de columnstore. Reorganiseren vereist in eerste instantie extra CPU-bronnen om de gegevens te comprimeren, wat de algehele prestaties van het systeem kan vertragen. Echter, zodra de gegevens worden gecomprimeerd, query prestaties verbetert. Voor syntaxisvoorbeelden, zie voorbeelden: ColumnStore reorganiseren.
herbouwen van een index
herbouwen van een index daalt en maakt de index opnieuw aan. Afhankelijk van het type index en Database Engine versie, kan een rebuild operatie online of offline worden gedaan. Voor de T-SQL-syntaxis, zie ALTER INDEX REBUILD
-
voor rowstore-indexen, Rebuild verwijdert fragmentatie, claimt schijfruimte door de pagina ’s te comprimeren op basis van de opgegeven of bestaande vulfactor-instelling, en herschikt de indexrijen in aaneengesloten pagina’ s. Wanneer
ALL
is opgegeven, worden alle indexen in de tabel verwijderd en opnieuw opgebouwd in een enkele transactie. Belangrijke buitenlandse beperkingen hoeven niet van tevoren te worden afgeschaft. Wanneer indexen met 128 extents of meer worden herbouwd, stelt de Database Engine de werkelijke pagina deallocaties uit, en de bijbehorende vergrendelingen, tot na de transactie commits. Voor syntaxisvoorbeelden, zie voorbeelden: rowstore reorganiseren. -
voor columnstore-indexen verwijdert u fragmentatie, verplaatst u alle rijen naar de columnstore en herwint u schijfruimte door rijen die logisch uit de tabel zijn verwijderd fysiek te verwijderen.
Tip
beginnend met SQL Server 2016 (13.x), is het herbouwen van de columnstore index meestal niet nodig omdat
REORGANIZE
de essentie van een heropbouw op de achtergrond als een online operatie uitvoert.voor syntaxisvoorbeelden, zie voorbeelden: ColumnStore rebuild.
Machtigingen
vereist ALTER
toestemming op de tabel of weergave. Gebruiker moet lid zijn van ten minste één van de volgende rollen:
- db_ddladmin database rol 1
- db_owner database rol
- sysadmin server rol
1db_ddladmin database rol is de minst bevoorrechte.
verwijder fragmentatie met SQL Server Management Studio
om een index
- te reorganiseren of opnieuw op te bouwen in Objectverkenner, vouwt u de database uit die de tabel bevat waarop u een index wilt reorganiseren.
- vouw de map tabellen uit.
- vouw de tabel uit waarop u een index wilt reorganiseren.
- vouw de map indexen uit.
- Klik met de rechtermuisknop op de index die u wilt reorganiseren en selecteer reorganiseren.
- Controleer in het dialoogvenster indexen reorganiseren of de juiste index zich in het raster van de indexen bevindt en klik op OK.
- Schakel het selectievakje kolomgegevens voor grote objecten Compact in om op te geven dat alle pagina ‘ s met LOB-gegevens (large object) ook worden gecomprimeerd.
- klik op OK.
om alle indexen in een tabel
- in Object Explorer te reorganiseren, vouwt u de database uit die de tabel bevat waarop u de indexen wilt reorganiseren.
- vouw de map tabellen uit.
- vouw de tabel uit waarop u de indexen wilt reorganiseren.
- Klik met de rechtermuisknop op de map indexen en selecteer Alles reorganiseren.
- Controleer in het dialoogvenster indexen reorganiseren of de juiste indexen in de te reorganiseren indexen staan. Als u een index wilt verwijderen uit de indexen die moeten worden gereorganiseerd, selecteert u de index en drukt u vervolgens op de Delete-toets.
- Schakel het selectievakje kolomgegevens voor grote objecten Compact in om op te geven dat alle pagina ‘ s met LOB-gegevens (large object) ook worden gecomprimeerd.
- klik op OK.
om een index
- opnieuw op te bouwen in Object Explorer, vouwt u de database uit die de tabel bevat waarop u een index wilt reorganiseren.
- vouw de map tabellen uit.
- vouw de tabel uit waarop u een index wilt reorganiseren.
- vouw de map indexen uit.
- Klik met de rechtermuisknop op de index die u wilt reorganiseren en selecteer opnieuw opbouwen.
- Controleer in het dialoogvenster indexen opnieuw opbouwen of de juiste index zich in het raster indexen bevindt en klik op OK.
- Schakel het selectievakje kolomgegevens voor grote objecten Compact in om op te geven dat alle pagina ‘ s met LOB-gegevens (large object) ook worden gecomprimeerd.
- klik op OK.
verwijder fragmentatie met behulp van Transact-SQL
Note
voor meer voorbeelden over het gebruik van Transact-SQL om indexen opnieuw op te bouwen of te reorganiseren, zie ALTER Index Examples: Columnstore indexen en ALTER INDEX Examples: Rowstore indexen.
om een gefragmenteerde index te reorganiseren
het volgende voorbeeld reorganiseert deIX_Employee_OrganizationalLevel_OrganizationalNode
index op deHumanResources.Employee
tabel in deAdventureWorks2016
database.
ALTER INDEX IX_Employee_OrganizationalLevel_OrganizationalNode ON HumanResources.Employee REORGANIZE;
het volgende voorbeeld reorganiseert de IndFactResellerSalesXL_CCI
columnstore index op de dbo.FactResellerSalesXL_CCI
tabel in de AdventureWorksDW2016
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);
om alle indexen in een tabel te reorganiseren
het volgende voorbeeld reorganiseert alle indexen in de HumanResources.Employee
tabel in de AdventureWorks2016
database.
ALTER INDEX ALL ON HumanResources.Employee REORGANIZE;
om een gefragmenteerde index opnieuw op te bouwen
het volgende voorbeeld bouwt een enkele index op de Employee
tabel in de AdventureWorks2016
database.
ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.EmployeeREBUILD;
om alle indexen in een tabel opnieuw op te bouwen
het volgende voorbeeld herbouwt alle indexen die geassocieerd zijn met de tabel in de AdventureWorks2016
database met behulp van het ALL
sleutelwoord. Er worden drie opties gespecificeerd.
ALTER INDEX ALL ON Production.ProductREBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON);
voor meer informatie, zie ALTER INDEX (Transact-SQL).
automatisch index-en statistiekenbeheer
Hefboomoplossingen zoals adaptieve Indexdefragmentatie voor het automatisch beheren van indexdefragmentatie en statistieken-updates voor een of meer databases. Deze procedure kiest automatisch of een index opnieuw moet worden opgebouwd of gereorganiseerd op basis van het fragmentatieniveau, onder andere parameters, en statistieken moet worden bijgewerkt met een lineaire drempel.
overwegingen die specifiek zijn voor het herbouwen van rowstore-indexen
het herbouwen van een geclusterde index herbouwt automatisch elke niet-geclusterde index die verwijst naar de clustering key, als de fysieke of logische identifiers in de niet-geclusterde indexrecords moeten veranderen.
de volgende scenario ‘ s dwingen alle rowstore niet-geclusterde indexen op een tabel automatisch te herbouwen:
- Een geclusterde index aanmaken op een tabel
- Een geclusterde index verwijderen, waardoor de tabel wordt opgeslagen als een heap
- de clustering-sleutel wordt gewijzigd in kolommen
de volgende scenario ‘ s vereisen niet dat alle rowstore niet-geclusterde indexen automatisch opnieuw worden opgebouwd op een tabel:
- herbouwen van een unieke geclusterde index
- herbouwen van een niet-unieke geclusterde index
- het indexschema wijzigen, zoals het toepassen van een partitioneringsschema op een geclusterde index of het verplaatsen van de geclusterde index naar een andere bestandsgroep
belangrijk
een index kan niet worden gereorganiseerd of herbouwd als de bestandsgroep waarin deze zich bevindt offline is of op Alleen-lezen is ingesteld. Als het trefwoord ALL is opgegeven en een of meer indexen in een offline of alleen-lezen bestandgroep staan, mislukt het statement.
als een index opnieuw wordt opgebouwd, moet het fysieke medium voldoende ruimte hebben om twee kopieën van de index op te slaan. Wanneer de heropbouw is voltooid, verwijdert de Database-Engine de oorspronkelijke index.
wanneer ALL
is gespecificeerd met het ALTER INDEX
statement, worden relationele indexen, zowel geclusterde als niet-geclusterde, en XML-indexen op de tabel gereorganiseerd.
specifieke overwegingen voor het herbouwen van een columnstore-index
bij het herbouwen van een columnstore-index leest de Database-Engine alle gegevens van de oorspronkelijke columnstore-index, inclusief de delta-store. Het combineert de gegevens in nieuwe rowgroups, en comprimeert de rowgroups in de columnstore. De Database-Engine defragmenteert de columnstore door fysiek rijen te verwijderen die logisch uit de tabel zijn verwijderd. De verwijderde bytes worden teruggewonnen op de schijf.
Note
het reorganiseren van een columnstore-index met behulp van Management Studio zal gecomprimeerde rowgroups combineren, maar dwingt niet alle rowgroups te worden gecomprimeerd in de columnstore. Gesloten rowgroups worden gecomprimeerd, maar OPEN rowgroups worden niet gecomprimeerd in de columnstore.To comprimeer alle rijgroepen met geweld, gebruik het onderstaande voorbeeld van Transact-SQL.
opmerking
beginnend met SQL Server 2019 (15.x), de tuple-mover wordt geholpen door een achtergrond merge taak die automatisch comprimeert kleinere open delta rowgroups die al enige tijd bestaan zoals bepaald door een interne drempel, of voegt gecomprimeerde rowgroups van waaruit een groot aantal rijen is verwijderd. Dit verbetert de columnstore index kwaliteit na verloop van tijd.
voor meer informatie over columnstore termen en concepten, zie Columnstore indexen: Overview.
een partitie herbouwen in plaats van de gehele tabel
- het herbouwen van de gehele tabel duurt lang als de index groot is, en het vereist voldoende schijfruimte om een extra kopie van de index op te slaan tijdens het herbouwen. Meestal is het alleen nodig om de meest recent gebruikte partitie opnieuw op te bouwen.
- voor gepartitioneerde tabellen hoeft u niet de volledige columnstore-index opnieuw op te bouwen, omdat fragmentatie waarschijnlijk alleen voorkomt in de partities die onlangs zijn gewijzigd. Fact tabellen en grote dimensie tabellen worden meestal gepartitioneerd om back-up en beheer operaties uit te voeren op brokken van de tabel.
een partitie herbouwen na zware DML-bewerkingen
een partitie herbouwen defragmenteert de partitie en vermindert schijfopslag. Rebuilding verwijdert alle rijen uit de columnstore die zijn gemarkeerd voor verwijdering en verplaatst alle rowgroups van de delta store naar de columnstore. Er kunnen meerdere rijgroepen in de delta-opslag zijn die minder dan een miljoen rijen hebben.
een partitie herbouwen na het laden van gegevens
een partitie herbouwen na het laden van de datum zorgt ervoor dat alle gegevens worden opgeslagen in de columnstore. Wanneer gelijktijdige processen elke belasting minder dan 100.000 rijen in dezelfde partitie op hetzelfde moment, de partitie kan eindigen met meerdere delta stores. Herbouwen verplaatst alle Delta store rijen naar de columnstore.
specifieke overwegingen voor het reorganiseren van een columnstore-index
bij het reorganiseren van een columnstore-index comprimeert de Database-Engine elke gesloten delta-rijgroep in de columnstore als een gecomprimeerde rijgroep. Te beginnen met SQL Server 2016 (13.x) en in de Azure SQL-Database voert het commando REORGANIZE
de volgende extra defragmentatieoptimalisaties online uit:
-
verwijdert fysiek rijen uit een rijgroep wanneer 10% of meer van de rijen logisch verwijderd zijn. De verwijderde bytes worden teruggewonnen op de fysieke media. Als een gecomprimeerde rijgroep van 1 miljoen rijen bijvoorbeeld 100K-rijen heeft verwijderd, verwijdert SQL Server de verwijderde rijen en comprimeert de rijgroep met 900k-rijen. Het bespaart op de opslag door verwijderde rijen te verwijderen.
-
combineert een of meer gecomprimeerde rijgroepen om rijen per rijgroep te verhogen tot maximaal 1.048.576 rijen. Als u bijvoorbeeld 5 batches van 102.400 rijen in bulk importeert, krijgt u 5 gecomprimeerde rowgroups. Als u reorganiseren uitvoert, worden deze rijgroepen samengevoegd tot 1 gecomprimeerde rijgroep met grootte 512.000 rijen. Dit veronderstelt dat er geen woordenboekgrootte of geheugenbeperkingen waren.
-
voor rijgroepen waarin 10% of meer van de rijen logisch zijn verwijderd, probeert de Database-Engine deze rijgroep te combineren met een of meer rijgroepen. Rijgroep 1 is bijvoorbeeld gecomprimeerd met 500.000 rijen en rijgroep 21 is gecomprimeerd met maximaal 1.048.576 rijen. Rijgroep 21 heeft 60% van de rijen verwijderd waardoor er 409.830 rijen overblijven. De Database-Engine is voorstander van het combineren van deze twee rijgroepen om een nieuwe rijgroep met 909.830 rijen te comprimeren.
Na het uitvoeren van gegevensladingen kunt u meerdere kleine rowgroups hebben in het delta-archief. U kunt ALTER INDEX REORGANIZE
gebruiken om alle rowgroups in de columnstore te forceren en vervolgens de rowgroups te combineren in minder rowgroups met meer rijen. Bij het reorganiseren worden ook rijen verwijderd die uit de columnstore zijn verwijderd.
beperkingen en beperkingen
rowstore indexen met meer dan 128 extensies worden herbouwd in twee afzonderlijke fasen: logisch en fysiek. In de logische fase worden de bestaande toewijzingseenheden die door de index worden gebruikt gemarkeerd voor deallocatie, worden de gegevensrijen gekopieerd en gesorteerd en vervolgens verplaatst naar nieuwe toewijzingseenheden die zijn gemaakt om de herbouwde index op te slaan. In de fysieke fase, de allocatie eenheden eerder gemarkeerd voor deallocatie worden fysiek gedaald in korte transacties die gebeuren op de achtergrond, en vereisen niet veel sloten. Zie De Gids Pages and Extents Architecture voor meer informatie over extents.
de instructie ALTER INDEX REORGANIZE
vereist dat het gegevensbestand met de index ruimte beschikbaar heeft, omdat de bewerking alleen tijdelijke werkpagina ‘ s kan toewijzen op hetzelfde bestand, niet in een ander bestand binnen de bestandsgroep. Dus hoewel de bestandsgroep misschien Vrije pagina ‘ s beschikbaar heeft, kan de gebruiker nog steeds fout 1105 tegenkomen: 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.
waarschuwing
het maken en herbouwen van niet-uitgelijnde indexen op een tabel met meer dan 1.000 partities is mogelijk, maar wordt niet ondersteund. Dit kan leiden tot verminderde prestaties of overmatig geheugengebruik tijdens deze operaties. Microsoft raadt aan om alleen uitgelijnde indexen te gebruiken wanneer het aantal partities groter is dan 1.000.
een index kan niet gereorganiseerd of herbouwd worden als de bestandsgroep waarin het zich bevindt offline is of als alleen-lezen ingesteld is. Als het trefwoord ALL
is opgegeven en een of meer indexen zich in een offline of alleen-lezen bestandgroep bevinden, mislukt het statement.
statistieken:
-
wanneer een index wordt aangemaakt of herbouwd, worden statistieken aangemaakt of bijgewerkt door alle rijen in de tabel te scannen. Echter, te beginnen met SQL Server 2012 (11.x), statistieken worden niet gemaakt of bijgewerkt door het scannen van alle rijen in de tabel wanneer een gepartitioneerde index wordt gemaakt of herbouwd. In plaats daarvan gebruikt de Query Optimizer het standaard sampling-algoritme om deze statistieken te genereren. Om statistieken over gepartitioneerde indexen te verkrijgen door alle rijen in de tabel te scannen, gebruikt u statistieken maken of statistieken bijwerken met de
FULLSCAN
clausule. -
wanneer een index wordt gereorganiseerd, worden de statistieken niet bijgewerkt.
een index kan niet worden gereorganiseerd wanneer ALLOW_PAGE_LOCKS
is ingesteld op OFF.
tot en met SQL Server 2017 (14.x), het herbouwen van een geclusterde columnstore index is een offline operatie. De database-engine moet een exclusief slot op de tafel of partitie verkrijgen terwijl de rebuild plaatsvindt. De gegevens zijn offline en niet beschikbaar tijdens de heropbouw, zelfs wanneer NOLOCK
, Read-commit Snapshot Isolation (RCSI), of Snapshot Isolation wordt gebruikt.Te beginnen met SQL Server 2019 (15.x), kan een geclusterde columnstore-index opnieuw worden opgebouwd met de optie ONLINE = ON
.
voor een tabel met Azure Synapse Analytics (voorheen Azure Synapse Analytics) met een geordende columnstore-index, zal ALTER INDEX REBUILD
de gegevens opnieuw sorteren met TempDB. Monitor TempDB tijdens rebuild operaties. Als je meer TempDB ruimte nodig hebt, schaal het datawarehouse. Schalen terug naar beneden zodra de index rebuild is voltooid.
voor een tabel met Azure Synapse Analytics (voorheen Azure Synapse Analytics) met een geordende geclusterde columnstore-index, sorteert ALTER INDEX REORGANIZE
de gegevens niet opnieuw. Gebruik ALTER INDEX REBUILD
om de gegevens te gebruiken.
door INDEX REBUILD te gebruiken om te herstellen van hardwarefouten
In eerdere versies van SQL Server, kunt u soms een rowstore niet-geclusterde index herbouwen om inconsistenties veroorzaakt door hardwarefouten te corrigeren.Vanaf SQL Server 2008 kunt u nog steeds dergelijke inconsistenties tussen de index en de geclusterde index herstellen door offline een niet-geclusterde index opnieuw op te bouwen. U kunt echter niet-geclusterde indexinconsistenties herstellen door de index online opnieuw op te bouwen, omdat het online-herbouwmechanisme de bestaande niet-geclusterde index gebruikt als basis voor de heropbouw en zo de inconsistentie blijft bestaan. Het opnieuw opbouwen van de index offline kan soms een scan van de geclusterde index (of heap) forceren en zo de inconsistentie verwijderen. Om te zorgen voor een heropbouw van de geclusterde index, drop en opnieuw de niet-geclusterde index. Net als bij eerdere versies, raden we aan om te herstellen van inconsistenties door het herstellen van de getroffen gegevens van een back-up; U kunt echter mogelijk de index inconsistenties herstellen door de niet-geclusterde index offline opnieuw op te bouwen. Zie DBCC CHECKDB (Transact-SQL) voor meer informatie.
Zie ook:
- SQL Server Index Architectuur en Design Guide
- Voer Index Operaties Online
- WIJZIGEN INDEX (Transact-SQL)
- Adaptive Index Defrag
- het MAKEN van STATISTIEKEN (Transact-SQL)
- UPDATE STATISTIEK (Transact-SQL)
- Columnstore Indexen van de Prestaties van Query
- aan de slag met Columnstore voor real-time operationele analytics
- Columnstore Indexen voor Data Warehousing
- Columnstore indexen en het samenvoegen van beleid voor rowgroups