Resolve index fragmentation by reorganizing or rebuilding indexes

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

Applies to: yesSQL Server (kaikki tuetut versiot) YesAzure SQL Database YesAzure SQL Managed Instance yesAzure Synapse Analytics Kyllärinnakkainen tietovarasto

tässä artikkelissa kuvataan, miten indeksin eheytys tapahtuu ja käsitellään sen vaikutusta kyselyn suorituskykyyn. Kun määrität indeksin pirstoutumisen määrän, voit eheyttää indeksin joko järjestämällä indeksin uudelleen tai rakentamalla indeksin uudelleen suorittamalla Transact-SQL-komentoja valitsemassasi työkalussa tai käyttämällä SQL Server Management studiota.

indeksin fragmentaatio yleiskatsaus

mikä on indeksin fragmentaatio ja miksi siitä pitäisi välittää:

  • fragmentaatio on olemassa, kun indekseissä on sivuja, joissa indeksin looginen järjestys, joka perustuu indeksin avainarvoon, ei vastaa indeksisivujen sisällä olevaa fyysistä järjestystä.
  • tietokantamoottori muuttaa indeksejä automaattisesti aina, kun pohjatietoihin tehdään Lisää, päivitä tai poista toimintoja. Esimerkiksi rivien lisääminen taulukkoon voi aiheuttaa rivikauppa-indeksien olemassa olevien sivujen jakaantumisen, jotta voidaan lisätä uusia avainarvoja. Ajan myötä nämä muutokset voivat aiheuttaa sen, että indeksin tiedot hajaantuvat tietokantaan (pirstoutuvat). Fragmentaatio on olemassa, kun indekseillä on sivuja, joilla looginen järjestys, joka perustuu avainarvoon, ei vastaa fyysistä tilausta tiedoston sisällä.
  • voimakkaasti pirstoutuneet indeksit voivat heikentää kyselyn suorituskykyä, koska tarvitaan lisää I / O: ta etsimään tietoja, joihin indeksi osoittaa. Enemmän I / O aiheuttaa sovelluksen reagoimaan hitaasti, varsinkin kun skannaustoiminnot ovat mukana.

fragmentaation määrän havaitseminen

ensimmäinen vaihe päätettäessä, mitä indeksin eheytysmenetelmää käytetään, on indeksin analysointi fragmentaation asteen määrittämiseksi. Havaitset pirstoutumisen eri tavalla rivikauppa-ja kolumnikauppa-indekseissä.

Huomautus

on erityisen tärkeää tarkastella indeksin tai kasan pirstoutumista sen jälkeen, kun suuria tietomääriä on poistettu. Jos kasoja päivitetään usein, saattaa olla tarpeen tarkastella sirpaloitumista uudelleen, jotta voidaan välttää huolintatietojen lisääntyminen. Lisätietoja kasoista on kohdassa kasat (taulukot ilman ryhmitettyjä indeksejä).

havaitsevat rivikauppa-indeksien sirpaloitumisen

käyttämällä sys-järjestelmää.dm_db_index_physical_stats, voit havaita fragmentaation tietyssä indeksissä, kaikki indeksit taulukossa tai indeksoitu näkymä, kaikki indeksit tietokannassa, tai kaikki indeksit kaikissa tietokannoissa. Osioiduille indekseille sys. dm_db_index_physical_stats tarjoaa myös sirpaloitumistiedot jokaisesta osiosta.

SYS: n palauttama tulosjoukko. dm_db_index_physical_stats sisältää seuraavat sarakkeet:

sarake
avg_fragmentation_in_percent loogisen fragmentaation prosenttiosuus (indeksin Out-of-order-sivut).
fragment_count katkelmien lukumäärä (fyysisesti peräkkäisten lehtien sivut) hakemistossa.
avg_fragment_size_in_sivut keskimääräinen Sivumäärä yhdessä katkelmassa hakemistossa.

kun fragmentaation aste on tiedossa, määritetään seuraavasta taulukosta paras menetelmä fragmentaation poistamiseksi: indeksin uudelleenjärjestely tai indeksi.

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 ja ALTER INDEX REBUILD. Todelliset arvot voivat kuitenkin vaihdella tapauskohtaisesti. On tärkeää, että kokeilet, mikä on paras kynnys omalle ympäristöllesi.

Tip

esimerkiksi, jos tiettyä indeksiä käytetään lähinnä skannausoperaatioissa, sirpaloitumisen poistaminen voi parantaa näiden operaatioiden suorituskykyä. Suoritushyötyä ei välttämättä ole havaittavissa indekseillä, joita käytetään pääasiassa seek-operaatioihin.
vastaavasti pirstoutumisen poistaminen kasasta (taulukko, jossa ei ole ryhmitettyä indeksiä) on erityisen hyödyllistä yhdistämättömissä indeksiskannausoperaatioissa, mutta sillä on vain vähän vaikutusta hakuoperaatioissa.

2 indeksin uudelleenrakentaminen voidaan suorittaa verkossa tai offline-tilassa. Indeksin uudelleenjärjestely suoritetaan aina verkossa. Saavuttaa saatavuus samanlainen uudelleenjärjestely vaihtoehto, sinun pitäisi rakentaa indeksit verkossa. Lisätietoja, Katso INDEX ja suorittaa Indeksioperaatioita verkossa.

indeksejä, joiden fragmentaatio on alle 5 prosenttia, ei tarvitse eheyttää, koska näin pienen fragmentaation poistamisesta saatava hyöty on lähes aina huomattavasti suurempi kuin indeksin uudelleenjärjestämisestä tai uudelleen rakentamisesta aiheutuneet suorittimen kustannukset. Myöskään pienten rivikauppojen indeksien uudelleenrakentaminen tai uudelleenjärjestely ei yleensä vähennä varsinaista pirstaloitumista.SQL Server 2014 (12.x), SQL Server-tietokantamoottori jakaa tilaa käyttäen sekajännitteitä. Siksi pienten hakemistojen sivuja säilytetään joskus sekamuotoisina. Sekajännitteitä jakaa jopa kahdeksan kappaletta, joten pienen indeksin sirpaloituminen ei välttämättä vähene uudelleenjärjestelyn tai uudelleenrakentamisen jälkeen. Katso myös näkökohtia erityisesti uudelleenrakentaminen rivikauppa indeksit. Lisätietoja extents, katso sivut ja Extents Architecture Guide.

havaitessasi sarakeindeksien sirpaloitumisen

käyttämällä sys.dm_db_column_store_row_group_physical_statsia voit määrittää indeksin poistettujen rivien prosenttiosuuden, mikä on kohtuullinen mitta sarakeindeksin riviryhmälle. Käytä tätä tietoa laskemaan fragmentaatio tietyssä indeksissä, kaikki indeksit taulukossa, kaikki indeksit tietokannassa, tai kaikki indeksit kaikissa tietokannoissa.

sys: n palauttama tulosjoukko dm_db_column_store_row_group_physial_stats sisältää seuraavat sarakkeet:

kuvaus

sarake
total_rows fyysisten varastoitujen rivien lukumäärä riviryhmässä. Pakattujen riviryhmien osalta tähän sisältyvät rivit, jotka on merkitty poistetuiksi.
deleted_rows niiden pakattuun riviryhmään fyysisesti tallennettujen rivien lukumäärä, jotka on merkitty poistettaviksi. 0 riviryhmille, jotka ovat Delta Storessa.

käytä tätä tietoa palautettuna indeksin fragmentaation laskemiseen tällä kaavalla:

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

kun indeksin fragmentaation aste on tiedossa, käytä seuraavaa taulukkoa parhaan menetelmän määrittämiseksi fragmentaation poistamiseksi: indeksin uudelleenjärjestely tai indeksi.

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 REORGANISIZE

rivistori-indeksin fragmentaation tarkistamiseksi Transact-SQL: n avulla

seuraavassa esimerkissä todetaan kaikkien indeksien keskimääräinen fragmentaatioprosentti HumanResources.Employee taulukkoAdventureWorks2016 tietokannassa.

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

edellinen lauseke palauttaa seuraavan kaltaisen tulosjoukon.

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)

lisätietoja, KS.sys.dm_db_index_physial_stats.

sarakeindeksin fragmentaation tarkistamiseksi Transact-SQL: n avulla

seuraavassa esimerkissä löydetään kaikkien indeksien keskimääräinen fragmentaatioprosentti dbo.FactResellerSalesXL_CCI taulukossa AdventureWorksDW2016 tietokannasta.

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;

edellinen lausuma palauttaa seuraavan kaltaisen tulosjoukon.

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

Check index fragmentation using SQL Server Management Studio

Note

Management studiota ei voi käyttää SQL Serverin sarakeindeksien fragmentaation laskemiseen, eikä sitä voi käyttää Azure SQL-tietokannan indeksien fragmentaation laskemiseen. Käytä edellistä Transact-SQL-esimerkkiä.

  1. Laajenna Object Explorerissa tietokanta, joka sisältää taulukon, josta haluat tarkistaa indeksin sirpaloitumisen.
  2. Laajenna taulukot-kansio.
  3. Laajenna taulukko, josta haluat tarkistaa indeksin sirpaloitumisen.
  4. Laajenna Hakemistokansio.
  5. napsauta hiiren kakkospainikkeella hakemistoa, jonka sirpaloitumisen haluat tarkistaa, ja valitse Ominaisuudet.
  6. Valitse sivun kohdalta pirstoutuminen.

Sirpalesivulla on seuraavat tiedot:

arvo
sivun täyteläisyys ilmaisee indeksisivujen keskimääräistä täyteläisyyttä prosentteina. 100% tarkoittaa, että hakemistosivut ovat täysin täynnä. 50 prosenttia tarkoittaa sitä, että jokainen hakemistosivu on keskimäärin puoliksi täynnä.
Kokonaisfragmentaatio looginen fragmentaatioprosentti. Tämä kertoo, kuinka monta sivua hakemistossa ei ole tallennettu järjestykseen.
keskimääräinen rivikoko lehtitasoisen rivin keskikoko.
syvyys indeksin tasojen lukumäärä, mukaan lukien lehtitaso.
välitti tietueet niiden tietueiden määrän kasassa, joilla on eteenpäin osoittimet toiseen datapaikkaan. (Tämä tila tapahtuu päivityksen aikana, kun ei ole tarpeeksi tilaa tallentaa uusi rivi alkuperäiseen paikkaan.)
Haamurivit niiden rivien lukumäärä, jotka on merkitty poistetuiksi, mutta ei vielä poistetuiksi. Nämä rivit poistetaan puhdistuskierteellä, kun palvelin ei ole varattu. Tämä arvo ei sisällä rivejä, jotka säilytetään erinomaisen snapshot isolation-tapahtuman vuoksi.
Indeksityyppi indeksityyppi. Mahdollisia arvoja ovat Clustered index, Nonclustered index ja Primary XML. Taulukoita voidaan tallentaa myös kasana (ilman indeksejä), mutta sitten tätä indeksin Ominaisuussivua ei voida avata.
Lehtitasoiset rivit lehtitasoisten rivien lukumäärä.
Enimmäisrivin koko lehtitason enimmäisrivin koko.
vähimmäisrivin koko lehtitason vähimmäisrivin koko.
sivut tietosivujen kokonaismäärä.
Osiotunnus indeksin sisältävän B-puun osiotunnus.
Version haamurivit niiden haamurivien määrä, joita säilytetään merkittävän snapshot isolation-tapahtuman vuoksi.

indeksien Eheyttäminen uudelleen tai uudelleenjärjestämällä

rikkonut hajanaisen indeksin jollakin seuraavista menetelmistä:

  • indeksin uudelleenjärjestely
  • indeksin uudelleenjärjestely

Huomautus

ositusjärjestelmälle rakennetuissa osioindekseissä voidaan käyttää jompaakumpaa seuraavista menetelmistä kokonaiselle indeksille tai indeksin yksittäiselle osiolle.

Järjestä indeksi uudelleen

indeksin uudelleenjärjestely käyttää minimaalisia järjestelmäresursseja ja on online-operaatio. Tämä tarkoittaa, että pitkän aikavälin estotaulukon lukkoja ei pidetä ja kyselyt tai päivitykset alla olevaan taulukkoon voivat jatkua ALTER INDEX REORGANIZE tapahtuman aikana.

  • sowstore-indeksien osalta tietokantamoottori eheyttää taulukoiden ja näkymien ryhmiteltyjen ja yhdistelemättömien indeksien lehtitason järjestämällä fyysisesti lehtitasoiset sivut vastaamaan lehtien solmujen loogista järjestystä (vasemmalta oikealle). Uudelleenjärjestely myös tiivistää indeksisivut indeksin täyttökertoimen arvon perusteella. Voit tarkastella täyttökertoimen asetusta käyttämällä sys-järjestelmää.hakemisto. Syntaksiesimerkkejä, katso esimerkkejä: Rowstore reorganisate.

  • kun käytetään columnstore-indeksejä, Delta store voi päätyä useisiin pieniin riviryhmiin lisättyään, päivittäessään ja poistettuaan tietoja ajan myötä. Kolumnstore-indeksin uudelleenjärjestely pakottaa kaikki riviryhmät kolumnstoreen ja yhdistää sitten riviryhmät harvempiin riviryhmiin, joissa on enemmän rivejä. Uudelleenjärjestely poistaa myös rivejä, jotka on poistettu palstakaupasta. Uudelleenjärjestely vaatii aluksi lisää suorittimen resursseja datan pakkaamiseen, mikä saattaa hidastaa järjestelmän yleistä suorituskykyä. Kuitenkin heti kun TIEDOT pakataan, kyselyn suorituskyky paranee. Syntaksiesimerkkejä, katso esimerkkejä: Columstore reorganisate.

Rakenna indeksi uudelleen

Uudelleenindeksi laskee ja luo indeksin uudelleen. Indeksin ja tietokannan moottoriversion tyypistä riippuen uudelleenrakentaminen voidaan tehdä verkossa tai offline-tilassa. T-SQL-syntaksin osalta katso ALTER INDEX REBUILD

  • rivikaupan indeksien osalta uudelleenrakentaminen poistaa pirstoutumisen, palauttaa levytilan tiivistämällä sivut määritetyn tai olemassa olevan täyttökertoimen perusteella ja järjestelee indeksirivit vierekkäisiksi sivuiksi. Kun ALL on määritelty, kaikki taulukossa olevat indeksit pudotetaan ja rakennetaan uudelleen yhdessä transaktiossa. Ulkomaisista keskeisistä rajoitteista ei tarvitse luopua etukäteen. Kun indeksit, joissa on 128 laajennusta tai enemmän, rakennetaan uudelleen, tietokantamoottori lykkää varsinaisia sivun deallocations,ja niihin liittyvät lukot, kunnes tapahtuman jälkeen sitoutuu. Syntaksiesimerkkejä, katso esimerkkejä: Rowstore reorganisate.

  • kolumnstore-indekseissä uudelleenrakentaminen poistaa sirpaloitumisen, siirtää kaikki rivit kolumnstoreen ja ottaa levytilan takaisin poistamalla fyysisesti taulukosta loogisesti poistetut rivit.

    Tip

    alkaen SQL Server 2016 (13.x), sarakeindeksin uudelleenrakentamista ei yleensä tarvita, koska REORGANIZE suorittaa peruskorjauksen taustalla verkko-operaationa.

    syntaksiesimerkit, katso esimerkkejä: ColumnStore rebuild.

käyttöoikeudet

vaatii ALTER luvan pöydälle tai näkymään. Käyttäjän tulee olla jäsenenä vähintään yhdessä seuraavista rooleista:

  • db_ddladmin tietokantarooli 1
  • db_owner tietokantarooli
  • sysadmin palvelinrooli

1db_ddladmin tietokantarooli on vähiten etuoikeutettu.

Poista fragmentaatio käyttämällä SQL Server Management studiota

järjestääksesi tai rakentaaksesi indeksin

  1. Object Explorerissa, Laajenna tietokanta, joka sisältää taulukon, johon haluat järjestää indeksin uudelleen.
  2. Laajenna taulukot-kansio.
  3. Laajenna taulukko, jolle haluat järjestää indeksin uudelleen.
  4. Laajenna Hakemistokansio.
  5. napsauta hiiren kakkospainikkeella hakemistoa, jonka haluat järjestää uudelleen, ja valitse Reorganize.
  6. tarkista Uudelleenjärjestettävien indeksien valintaikkunassa, että oikea indeksi on uudelleenjärjestettävässä ruudukossa, ja napsauta OK.
  7. valitse Compact large object column data-valintaruutu määrittääksesi, että kaikki sivut, jotka sisältävät large object (Lob) – tietoja, myös tiivistetään.
  8. klikkaa OK.

järjestääksesi kaikki taulukon indeksit uudelleen

  1. Object Explorerissa, Laajenna tietokanta, joka sisältää taulukon, johon haluat järjestää indeksit uudelleen.
  2. Laajenna taulukot-kansio.
  3. Laajenna taulukko, jolle haluat järjestää indeksit uudelleen.
  4. napsauta hiiren kakkospainikkeella Hakemistokansiota ja valitse Järjestä Kaikki uudelleen.
  5. tarkista Uudelleenjärjestettävässä indeksit-valintaikkunassa, että oikeat indeksit ovat uudelleen järjestettävissä indekseissä. Jos haluat poistaa indeksin uudelleen järjestettävistä indekseistä, valitse indeksi ja paina Poista-näppäintä.
  6. valitse Compact large object column data-valintaruutu määrittääksesi, että kaikki sivut, jotka sisältävät large object (Lob) – tietoja, myös tiivistetään.
  7. klikkaa OK.

rakentaaksesi indeksin

  1. Object Explorerissa, Laajenna tietokanta, joka sisältää taulukon, johon haluat järjestää indeksin uudelleen.
  2. Laajenna taulukot-kansio.
  3. Laajenna taulukko, jolle haluat järjestää indeksin uudelleen.
  4. Laajenna Hakemistokansio.
  5. napsauta hiiren kakkospainikkeella uudelleenjärjestettävää indeksiä ja valitse Rebuild.
  6. varmista Rebuild Indexes-valintaikkunassa, että oikea indeksi on uudelleenrakennettavassa ruudukossa ja valitse OK.
  7. valitse Compact large object column data-valintaruutu määrittääksesi, että kaikki sivut, jotka sisältävät large object (Lob) – tietoja, myös tiivistetään.
  8. klikkaa OK.

Poista fragmentaatio käyttämällä Transact-SQL

Huomautus

Jos haluat lisätietoja Transact-SQL: n käytöstä indeksien uudelleenrakentamiseen tai uudelleenjärjestämiseen, katso ALTER INDEX Examples: Columnstore Indexes and ALTER INDEX Examples: Rowstore Indexes.

hajanaisen indeksin uudelleenjärjestämiseksi

seuraava esimerkki järjestää IX_Employee_OrganizationalLevel_OrganizationalNode indeksin HumanResources.Employee taulukon AdventureWorks2016 tietokannan.

ALTER INDEX IX_Employee_OrganizationalLevel_OrganizationalNode ON HumanResources.Employee REORGANIZE;

seuraavassa esimerkissä IndFactResellerSalesXL_CCI kolumnstore-indeksi on dbo.FactResellerSalesXL_CCI taulukko AdventureWorksDW2016 tietokanta.

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

järjestääkseen kaikki indeksit uudelleen taulukossa

seuraava esimerkki järjestää uudelleen kaikki indeksit HumanResources.Employee taulukko AdventureWorks2016 tietokanta.

ALTER INDEX ALL ON HumanResources.Employee REORGANIZE;

hajanaisen indeksin uudelleenrakentamiseksi

seuraava esimerkki uusii yhden indeksin Employee taulukossa AdventureWorks2016 tietokannassa.

ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.EmployeeREBUILD;

rakentaa kaikki taulukon indeksit uudelleen

seuraavassa esimerkissä uusitaan kaikki taulukkoon liittyvät indeksit AdventureWorks2016 tietokannassa käyttäen ALL avainsanaa. Vaihtoehtoja on kolme.

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

lisätietoja, Katso ALTER INDEX (Transact-SQL).

Automaattinen indeksin ja tilastojen hallinta

Vipuratkaisut, kuten Adaptiivinen indeksin Eheyttäminen, indeksin eheyttämisen ja tilastopäivitysten automaattinen hallinta yhden tai useamman tietokannan osalta. Tässä menettelyssä valitaan automaattisesti, rakennetaanko indeksi uudelleen vai järjestetäänkö se uudelleen sen sirpaloitumistason mukaan, muiden parametrien ohella, ja päivitetään tilastoja lineaarisella kynnysarvolla.

Rivikauppaindeksien uudelleenrakentamiseen liittyvät näkökohdat

Ryhmitetyn indeksin uudelleenrakentaminen automaattisesti uudistaa minkä tahansa ryhmittelyavaimeen viittaavan yhdistämättömän indeksin, jos yhdistämättömien indeksitietueiden sisältämien fyysisten tai loogisten tunnisteiden on muututtava.

seuraavat skenaariot pakottavat kaikki pöydällä olevat rivikaupan yhdistämättömät indeksit automaattisesti uudelleen:

  • ryhmitetyn indeksin luominen pöydälle
  • poistamalla ryhmitelty indeksi, jolloin taulukko tallennetaan kasaksi
  • muuttamalla ryhmittelyavainta sisältämään tai sulkemaan sarakkeita

seuraavat skenaariot eivät edellytä kaikkien rivikauppojen yhdistämättömien indeksien automaattisesti uudelleen pöydälle:

  • uniikin ryhmitetyn indeksin uudelleenrakentaminen
  • ei-yksilöllisen ryhmitetyn indeksin uudelleenrakentaminen
  • indeksin skeeman muuttaminen, kuten ryhmitetyn indeksin jakaminen ryhmiteltyyn indeksiin tai ryhmitetyn indeksin siirtäminen toiseen filegroupiin

tärkeä

indeksiä ei voida järjestää uudelleen tai rakentaa uudelleen, jos se filegroup, jossa se sijaitsee, on offline-tilassa tai asetetaan vain lukujärjestykseen. Kun avainsana ALL on määritetty ja yksi tai useampi hakemisto on offline-tilassa tai vain luettavassa filegroupissa, lausunto epäonnistuu.

indeksin uudelleenrakentamisen aikana fyysisessä mediassa on oltava riittävästi tilaa kahden kopion tallentamiseen indeksistä. Kun uudelleenrakentaminen on valmis, tietokantamoottori poistaa alkuperäisen indeksin.

kun ALL on määritelty ALTER INDEX lauseke, relaatioindeksit, sekä ryhmitetyt että yhdistämättömät, ja taulukon XML-indeksit on järjestetty uudelleen.

Kolumnstore-indeksin uudelleenrakentamiseen liittyviä huomioita

kolumnstore-indeksin uudelleenrakentamisessa tietokantamoottori lukee kaikki tiedot alkuperäisestä kolumnstore-indeksistä, mukaan lukien Delta store. Se yhdistää tiedot uusiksi riviryhmiksi ja pakkaa riviryhmät kolumnistoksi. Tietokantamoottori eheyttää pylvässtoren poistamalla fyysisesti taulukosta loogisesti poistetut rivit. Poistetut tavut palautetaan levylle.

Note

Kolumnstore-indeksin uudelleenjärjestely Management Studion avulla yhdistää pakatut riviryhmät yhteen, mutta ei pakota kaikkia riviryhmiä pakattavaksi kolumnstoreen. Suljetut riviryhmät pakataan, mutta avoimet riviryhmät eivät paketoidu columnstore.To pakkaa väkisin kaikki riviryhmät, käytä alla olevaa Transact-SQL-esimerkkiä.

Note

alkaen SQL Server 2019 (15.x), tuple-mover auttaa taustan yhdistämistehtävä, joka automaattisesti pakkaa pienempiä avoimia Delta riviryhmiä, jotka ovat olleet olemassa jonkin aikaa määritettynä sisäinen kynnys, tai yhdistää pakattuja riviryhmiä, joista suuri määrä rivejä on poistettu. Tämä parantaa kolumnstore-indeksin laatua ajan myötä.
Lisätietoja kolumnstore-termeistä ja-käsitteistä on Kolumnstore indexes: Overview.

rakentaa osion koko taulukon sijaan

  • koko taulukon uudelleenrakentaminen kestää kauan, jos indeksi on suuri, ja se vaatii tarpeeksi levytilaa ylimääräisen kopion tallentamiseksi indeksistä uudelleenrakentamisen aikana. Yleensä on vain tarpeen rakentaa viimeksi käytetty osio.
  • osioituihin taulukoihin ei tarvitse rakentaa koko sarakeindeksiä uudelleen, koska pirstoutumista esiintyy todennäköisesti vain osioissa, joita on muokattu äskettäin. Faktataulukot ja suuret ulottuvuustaulukot on yleensä jaettu osiin, jotta voidaan suorittaa varmuuskopiointi-ja hallintaoperaatioita taulukon paloissa.

Rakenna osio uudelleen raskaiden DML-operaatioiden jälkeen

osion uudelleenrakentaminen eheyttää osion ja vähentää levyn tallennustilaa. Uudelleenrakentaminen poistaa kaikki rivit sarakekaupasta, jotka on merkitty poistettavaksi, ja siirtää kaikki riviryhmät Delta-kaupasta sarakekauppaan. Delta Storessa voi olla useita riviryhmiä, joissa on alle miljoona riviä.

Rakenna osio uudelleen tietojen lataamisen jälkeen

osioiden uudelleenrakentaminen lastauspäivän jälkeen varmistaa, että kaikki tiedot tallennetaan sarakekauppaan. Kun samanaikaisesti käsitellään kunkin kuorman alle 100 000 riviä samaan osioon samaan aikaan, osio voi päätyä useisiin delta-varastoihin. Uudelleenrakentaminen siirtää kaikki Delta Storen rivit kolumnikauppaan.

Kolumnstore-indeksin uudelleenjärjestämiseen liittyvät näkökohdat

kun kolumnstore-indeksiä uudelleenjärjestellään, tietokantamoottori pakkaa jokaisen suljetun Delta-riviryhmän kolumnstoreen pakattuna riviryhmänä. Alkaen SQL Server 2016 (13.x) ja Azure SQL-tietokannassa REORGANIZE komento suorittaa seuraavat ylimääräiset eheytysoptimoinnit verkossa:

  • poistaa fyysisesti rivit riviryhmästä, kun vähintään 10% riveistä on loogisesti poistettu. Poistetut tavut haetaan takaisin fyysisessä mediassa. Jos esimerkiksi 1 miljoonan rivin pakatusta riviryhmästä on poistettu 100K rivejä, SQL Server poistaa poistetut rivit ja palauttaa riviryhmän 900k riveillä. Se säästää tallennustilaa poistamalla poistetut rivit.

  • yhdistää yhden tai useamman tiivistetyn riviryhmän kasvattaakseen rivejä per riviryhmä enintään 1 048 576 riviin. Esimerkiksi, jos irtotavarana tuoda 5 erää 102400 riviä saat 5 pakattu riviryhmiä. Jos suoritat uudelleenjärjestelyn, nämä riviryhmät yhdistetään 1 pakattuun riviryhmään, jonka koko on 512 000 riviä. Tämä olettaa, että sanakirjan kokoa tai muistirajoituksia ei ollut.

  • sellaisten riviryhmien osalta, joissa vähintään 10% riveistä on loogisesti poistettu, tietokantamoottori yrittää yhdistää tämän riviryhmän yhteen tai useampaan riviryhmään. Esimerkiksi riviryhmä 1 on pakattu 500 000 rivillä ja riviryhmä 21 enintään 1 048 576 rivillä. Riviryhmä 21: stä on poistettu 60% riveistä, jolloin jäljelle jää 409 830 riviä. Tietokantamoottori suosii näiden kahden riviryhmän yhdistämistä uuden riviryhmän tiivistämiseksi, jossa on 909 830 riviä.

datakuormien suorittamisen jälkeen Delta Storessa voi olla useita pieniä riviryhmiä. Voit käyttää ALTER INDEX REORGANIZE pakottaaksesi kaikki riviryhmät sarakkeeseen ja sitten yhdistääksesi riviryhmät harvemmiksi riviryhmiksi, joissa on enemmän rivejä. Uudelleenjärjestely poistaa myös rivejä, jotka on poistettu palstakaupasta.

rajoitukset ja rajoitukset

Sowstore-indeksit, joissa on yli 128 laajennusta, rakennetaan uudelleen kahdessa eri vaiheessa: loogisessa ja fyysisessä. Loogisessa vaiheessa indeksin käyttämät nykyiset allokointiyksiköt merkitään deallocationille, datarivit kopioidaan ja lajitellaan, minkä jälkeen ne siirretään uusiin allokointiyksiköihin, jotka on luotu uudelleen rakennetun indeksin tallentamiseksi. Fyysisessä vaiheessa aiemmin deallocationille merkityt allokaatioyksiköt pudotetaan fyysisesti taustalla tapahtuvissa lyhyissä tapahtumissa, eivätkä ne vaadi montaa lukkoa. Lisätietoja extents, katso sivut ja Extents Architecture Guide.

ALTER INDEX REORGANIZE lausuma edellyttää, että indeksin sisältävällä tiedostolla on tilaa, koska toiminto voi jakaa vain tilapäisiä työsivuja samaan tiedostoon, ei toiseen tiedostoon filegroupin sisällä. Joten vaikka filegroupilla saattaa olla vapaita sivuja saatavilla, käyttäjä voi silti kohdata virheen 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.

Varoitus

liittoutumattomien indeksien luominen ja uudelleenrakentaminen yli 1 000 osiota sisältävälle pöydälle on mahdollista, mutta sitä ei tueta. Näin toimiminen voi heikentää suorituskykyä tai aiheuttaa liiallista muistin kulutusta näiden toimintojen aikana. Microsoft suosittelee käyttämään vain kohdistettuja indeksejä, kun osioiden määrä ylittää 1 000.

indeksiä ei voida järjestää uudelleen tai rakentaa uudelleen, jos filegroup, jossa se sijaitsee, on offline-tilassa tai asetettu vain luku-muotoon. Kun hakusana ALL on määritelty ja yksi tai useampi hakemisto on offline-tai lukuryhmässä, lauseke epäonnistuu.

tilastot:

  • kun indeksi luodaan tai rakennetaan uudelleen, tilastot luodaan tai päivitetään skannaamalla kaikki taulukon rivit. Kuitenkin alkaen SQL Server 2012 (11.x), tilastoja ei luoda eikä päivitetä skannaamalla kaikki taulukon rivit, kun osioitu indeksi luodaan tai rakennetaan uudelleen. Sen sijaan kyselyn optimoija käyttää oletusnäytteenottoalgoritmia näiden tilastojen tuottamiseen. Jos haluat saada tilastoja jaetuista indekseistä skannaamalla kaikki taulukon rivit, käytä CREATE STATISTICS or UPDATE STATISTICS with the FULLSCAN clause.

  • kun indeksiä järjestellään uudelleen, tilastoja ei päivitetä.

indeksiä ei voida järjestää uudelleen, kun ALLOW_PAGE_LOCKS on asetettu pois.

SQL Server 2017 (14.x), uudelleenrakentaminen ryhmitelty kolumnstore indeksi on offline-toiminta. Tietokantamoottorin on hankittava eksklusiivinen Lukko pöydälle tai osioon uudelleenrakentamisen ajaksi. Tiedot ovat offline-tilassa ja poissa käytöstä uudelleenrakentamisen aikana myös käytettäessä NOLOCK, Read-committed Snapshot Isolation (Rcsi) tai Snapshot Isolation.Alkaen SQL Server 2019 (15.x), ryhmitelty pylväshakemisto voidaan rakentaa uudelleen käyttämällä ONLINE = ON – vaihtoehtoa.

Azure Synapse Analytics (aiemmin Azure Synapse Analytics)-taulukossa, jossa on tilattu sarakeindeksi, ALTER INDEX REBUILD lajittelee tiedot uudelleen TempDB: n avulla. Seuraa TempDB: tä uudelleenrakentamisen aikana. Jos tarvitset lisää TempDB-tilaa, laajenna tietovarastoa. Skaalaa takaisin alas, kun indeksin uudelleenrakentaminen on valmis.

Azure Synapse Analyticsin (aiemmin Azure Synapse Analytics) taulukosta, jossa on tilattu sarakeindeksi, ALTER INDEX REORGANIZE ei Lajittele tietoja uudelleen. Tiedon käyttöön ALTER INDEX REBUILD.

käyttämällä INDEX REBUILDIÄ laitteistovioista toipumiseen

SQL Serverin aiemmissa versioissa saattoi joskus rakentaa rivikaupan nonclustered-indeksin korjaamaan laitteistovikojen aiheuttamia epäjohdonmukaisuuksia.Alkaen SQL Server 2008, saatat silti pystyä korjaamaan tällaisia epäjohdonmukaisuuksia indeksin ja klusteroidun indeksin uudelleenrakentamalla nonclustered indeksi offline. Et kuitenkaan voi korjata nonclustered index-epäjohdonmukaisuuksia rakentamalla indeksin uudelleen verkossa, koska online rebuild mechanism käyttää olemassa olevaa nonclustered index-indeksiä jälleenrakentamisen perustana ja siten säilyttää epäjohdonmukaisuuden. Uudelleenrakentaminen indeksin offline voi joskus pakottaa skannauksen ryhmitelty indeksi (tai kasaan) ja niin poistaa epäjohdonmukaisuus. Varmistaa jälleenrakentaa klusteroitu indeksi, pudota ja luoda nonclustered indeksi. Kuten aiemmissa versioissa, suosittelemme toipumassa epäjohdonmukaisuuksia palauttamalla kyseiset tiedot varmuuskopiosta; kuitenkin, saatat pystyä korjaamaan indeksin epäjohdonmukaisuuksia uudelleenrakentamalla nonclustered indeksi offline. Lisätietoja on ohjeaiheessa DBCC CHECKDB (Transact-SQL).

Katso myös

  • SQL Server Index Architecture and Design Guide
  • Perform Index Operations Online
  • Alter INDEX (Transact-SQL)
  • CREATE STATISTICS (Transact-SQL)
  • UPDATE STATISTICS (Transact-SQL)
  • Columnstore Indexes Query Performance
  • analytiikka
  • tietovarastoinnin Sarakeindeksit
  • Sarakeindeksit ja riviryhmien yhdistämiskäytäntö

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *