Resolve index fragmentation by reorganizing or rebuilding indexes

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

Applies to: daSQL Server (toate versiunile acceptate) DaAzure SQL Database DaAzure SQL gestionat instanță daAzure Synapse Analytics Yesparallel data warehouse

Acest articol descrie modul în care apare defragmentarea indexului și discută impactul acestuia asupra performanței interogării. După ce determinați cantitatea de fragmentare care există pentru un index, puteți defragmenta un index fie reorganizând un index, fie reconstruind un index executând comenzi Transact-SQL în instrumentul ales sau utilizând SQL Server Management Studio.

index fragmentation overview

Ce este Index fragmentation și de ce ar trebui să-mi pese de asta:

  • fragmentarea există atunci când indexurile au pagini în care ordonarea logică din index, bazată pe valoarea cheie a indexului, nu se potrivește cu ordonarea fizică din interiorul paginilor index.
  • motorul bazei de date modifică automat indexurile ori de câte ori se efectuează operațiuni de inserare, actualizare sau ștergere a datelor subiacente. De exemplu, adăugarea de rânduri într-un tabel poate provoca pagini existente în indici rowstore pentru a împărți pentru a face loc pentru inserarea de noi valori cheie. În timp, aceste modificări pot face ca informațiile din index să fie împrăștiate în baza de date (fragmentate). Fragmentarea există atunci când indexurile au pagini în care ordonarea logică, bazată pe valoarea cheii, nu se potrivește cu ordonarea fizică din fișierul de date.
  • indexurile puternic fragmentate pot degrada performanța interogării, deoarece este necesară o I / O suplimentară pentru a localiza datele la care indică indexul. Mai multe I / O face ca aplicația dvs. să răspundă încet, mai ales atunci când sunt implicate operații de scanare.

detectarea cantității de fragmentare

primul pas în a decide ce metodă de defragmentare a indexului să se utilizeze este analiza indexului pentru a determina gradul de fragmentare. Detectați fragmentarea diferit pentru indici rowstore și indici columnstore.

notă

este deosebit de important să revizuiți fragmentarea indexului sau a heap-ului după ștergerea unor cantități mari de date. Pentru grămezi, dacă există actualizări frecvente, poate fi necesară și revizuirea fragmentării pentru a evita proliferarea înregistrărilor de expediere. Pentru mai multe informații despre grămezi, consultați grămezi (tabele fără indici grupați).

detectarea fragmentării indici rowstore

prin utilizarea sys.dm_db_index_physical_stats, puteți detecta fragmentarea într-un anumit index, toate indexurile pe un tabel sau vedere indexate, toate indexurile într-o bază de date, sau toate indexurile în toate bazele de date. Pentru indexurile partiționate, SYS.dm_db_index_physical_stats oferă, de asemenea, informații de fragmentare pentru fiecare partiție.

setul de rezultate returnat de SYS. dm_db_index_physical_stats include următoarele coloane:

oloana

descriere
avg_fragmentation_in_percent procentul de fragmentare logică (pagini în afara ordinii din index).
fragment_count numărul de fragmente (pagini de frunze consecutive fizic) în index.
avg_fragment_size_in_pages numărul mediu de pagini dintr-un fragment dintr-un index.

după ce gradul de fragmentare este cunoscut, utilizați următorul tabel pentru a determina cea mai bună metodă pentru a elimina fragmentarea: index reorganiza sau 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șiALTER INDEX REBUILD. Cu toate acestea, valorile reale pot varia de la caz la caz. Este important să experimentați pentru a determina cel mai bun prag pentru mediul dvs.

sfat

de exemplu, dacă un indice dat este utilizat în principal pentru operațiile de scanare, eliminarea fragmentării poate îmbunătăți performanța acestor operații. Beneficiul de performanță poate să nu fie vizibil pentru indicii care sunt utilizați în principal pentru operațiunile de căutare.în mod similar, eliminarea fragmentării într-o grămadă (un tabel fără index grupat) este utilă în special pentru operațiunile de scanare a indexului nonclustered, dar are un efect redus în operațiunile de căutare.

2 reconstruirea unui index poate fi executată online sau offline. Reorganizarea unui index este întotdeauna executată online. Pentru a obține disponibilitate similară opțiunii reorganizați, ar trebui să reconstruiți indexurile online. Pentru mai multe informații, consultați INDEX și efectuați operațiuni de Index Online.

indexurile cu fragmentare mai mică de 5% nu trebuie să fie defragmentate, deoarece beneficiul eliminării unei cantități atât de mici de fragmentare este aproape întotdeauna depășit cu mult de costul procesorului suportat pentru reorganizarea sau reconstruirea indexului. De asemenea, reconstruirea sau reorganizarea indici rowstore mici, în general, nu reduce fragmentarea reală.Până la, inclusiv, SQL Server 2014 (12.x), motorul bazei de date SQL Server alocă spațiu folosind extensii mixte. Prin urmare, paginile cu indici mici sunt uneori stocate pe Extensii mixte. Extensiile mixte sunt împărțite de până la opt obiecte, astfel încât fragmentarea într-un indice mic ar putea să nu fie redusă după reorganizarea sau reconstruirea acestuia. A se vedea, de asemenea, considerații specifice pentru reconstruirea indici rowstore. Pentru mai multe informații despre extensii, consultați Ghidul de arhitectură pagini și extensii.

detectarea fragmentării indexurilor columnstore

utilizând SYS.dm_db_column_store_row_group_physical_stats, puteți determina procentul de rânduri șterse dintr-un index, care este o măsură rezonabilă pentru fragmentarea într-un grup de rânduri al unui index columnstore. Utilizați aceste informații pentru a calcula fragmentarea într-un anumit index, toate indexurile de pe un tabel, toate indexurile dintr-o bază de date sau toate indexurile din toate bazele de date.

setul de rezultate returnat de SYS.dm_db_column_store_row_group_physical_stats include următoarele coloane:

coloană descriere
total_rows numărul de rânduri fizic stocate în grupul rând. Pentru grupurile de rânduri comprimate, aceasta include rândurile marcate ca șterse.
deleted_rows Numărul de rânduri stocate fizic într-un grup de rânduri comprimate care sunt marcate pentru ștergere. 0 pentru grupurile de rând care se află în magazinul delta.

utilizați aceste informații returnate pentru a calcula fragmentarea indexului folosind această formulă:

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

după ce gradul de fragmentare a indexului este cunoscut, utilizați următorul tabel pentru a determina cea mai bună metodă pentru a elimina fragmentarea: index reorganiza sau 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 reorganiza

pentru a verifica fragmentarea unui index rowstore folosind Transact-SQL

următorul exemplu găsește procentul mediu de fragmentare a tuturor indexurilor din HumanResources.Employee tabel în AdventureWorks2016 baza de date.

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

instrucțiunea anterioară returnează un set de rezultate similar cu următorul.

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)

pentru mai multe informații, consultați SYS.dm_db_index_physical_stats.

pentru a verifica fragmentarea unui index columnstore folosind Transact-SQL

următorul exemplu găsește procentul mediu de fragmentare a tuturor indexurilor din dbo.FactResellerSalesXL_CCI tabel în AdventureWorksDW2016 baza de date.

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;

instrucțiunea anterioară returnează un set de rezultate similar cu următorul.

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

verificați fragmentarea indexului folosind SQL Server Management Studio

notă

Management Studio nu poate fi utilizat pentru a calcula fragmentarea indexurilor columnstore în SQL Server și nu poate fi utilizat pentru a calcula fragmentarea niciunui index din Azure SQL Database. Utilizați exemplul precedent Transact-SQL.

  1. În Object Explorer, extindeți baza de date care conține tabelul pe care doriți să verificați fragmentarea unui index.
  2. extindeți folderul tabele.
  3. extindeți tabelul pe care doriți să verificați fragmentarea unui index.
  4. extindeți folderul indexuri.
  5. faceți clic dreapta pe indexul căruia doriți să verificați fragmentarea și selectați Proprietăți.
  6. sub Selectați o pagină, selectați fragmentare.

următoarele informații sunt disponibile pe pagina de fragmentare:

valoare descriere
pagina plinătatea indică plinătatea medie a paginilor index, ca procent. 100% înseamnă că paginile index sunt complet pline. 50% înseamnă că, în medie, fiecare pagină de index este pe jumătate plină.
fragmentarea totală procentul de fragmentare logică. Aceasta indică numărul de pagini dintr-un index care nu sunt stocate în ordine.
dimensiunea medie a rândului dimensiunea medie a unui rând la nivel de frunză.
adâncime numărul de niveluri din index, inclusiv nivelul frunzei.
înregistrări redirecționate numărul de înregistrări dintr-o grămadă care au indicatoare de redirecționare către o altă locație de date. (Această stare apare în timpul unei actualizări, când nu există suficient spațiu pentru a stoca noul rând în locația originală.)
rânduri fantomă numărul de rânduri care sunt marcate ca șterse, dar nu au fost încă eliminate. Aceste rânduri vor fi eliminate printr-un fir de curățare, atunci când serverul nu este ocupat. Această valoare nu include rândurile care sunt reținute din cauza unei tranzacții de izolare instantanee restante.
Tipul indexului tipul indexului. Valorile posibile sunt Index Cluster, index Nonclustered și XML primar. Tabelele pot fi, de asemenea, stocate ca heap (fără indexuri), dar atunci această pagină de proprietăți Index nu poate fi deschisă.
rânduri la nivel de frunze numărul de rânduri la nivel de frunze.
dimensiunea maximă a rândului dimensiunea maximă a rândului la nivel de frunză.
dimensiunea minimă a rândului dimensiunea minimă a rândului la nivel de frunză.
pagini numărul total de pagini de date.
ID-ul partiției ID-ul partiției arborelui b care conține indexul.
versiune rânduri fantomă numărul de înregistrări fantomă care sunt reținute din cauza unei tranzacții restante izolare instantaneu.

defragmentarea indexurilor prin reconstruirea sau reorganizarea indexului

defragmentați un index fragmentat utilizând una dintre următoarele metode:

  • index reorganizare
  • index rebuild

notă

pentru indexurile partiționate construite pe o schemă de partiție, puteți utiliza oricare dintre următoarele metode pe un index complet sau o singură partiție a unui index.

reorganizarea unui index

reorganizarea unui index utilizează resurse minime de sistem și este o operație online. Aceasta înseamnă că blocările tabelelor de blocare pe termen lung nu sunt reținute și interogările sau actualizările tabelului de bază pot continua în timpul tranzacției ALTER INDEX REORGANIZE.

  • pentru indexurile rowstore, motorul bazei de date defragmentează nivelul frunzelor de indexuri grupate și noncluzate pe tabele și vizualizări prin reordonarea fizică a paginilor la nivel de frunze pentru a se potrivi cu ordinea logică a nodurilor frunzelor (de la stânga la dreapta). Reorganizarea compactează, de asemenea, paginile indexului pe baza valorii factorului de umplere a indexului. Pentru a vizualiza setarea factorului de umplere, utilizați sys.indici. Pentru exemple de sintaxă, a se vedea exemple: Rowstore reorganiza.

  • când se utilizează indici columnstore, magazinul delta poate ajunge cu mai multe grupuri de rânduri mici după inserarea, actualizarea și ștergerea datelor în timp. Reorganizarea unui index columnstore forțează toate grupurile de rânduri în columnstore și apoi combină grupurile de rânduri în mai puține grupuri de rânduri cu mai multe rânduri. Operația de reorganizare elimină, de asemenea, rândurile care au fost șterse din columnstore. Reorganizarea necesită inițial resurse CPU suplimentare pentru a comprima datele, ceea ce poate încetini performanța generală a sistemului. Cu toate acestea, de îndată ce datele sunt comprimate, performanța interogării se îmbunătățește. Pentru exemple de sintaxă, consultați Exemple: ColumnStore reorganiza.

reconstruiți un index

reconstruirea unui index scade și recreează indexul. În funcție de tipul de index și versiunea motorului bazei de date, o operație de reconstrucție se poate face online sau offline. Pentru sintaxa T-SQL, consultați alter INDEX REBUILD

  • pentru indici rowstore, reconstruirea elimină fragmentarea, revendică spațiul pe disc prin compactarea paginilor pe baza setării factorului de umplere specificat sau existent și reordonează rândurile index în pagini contigue. CândALL este specificat, toți indicii de pe masă sunt abandonați și reconstruiți într-o singură tranzacție. Constrângerile cheie străine nu trebuie abandonate în avans. Atunci când indexurile cu 128 de extensii sau mai multe sunt reconstruite, motorul bazei de date amână real alocările de pagină și blocările asociate acestora, până după comiterea tranzacției. Pentru exemple de sintaxă, a se vedea exemple: Rowstore reorganiza.

  • pentru indici columnstore, reconstruirea elimină fragmentarea, mută toate rândurile în columnstore și recuperează spațiul pe disc ștergând fizic rândurile care au fost șterse logic din tabel.

    sfat

    începând cu SQL Server 2016 (13.x), reconstruirea indexului columnstore nu este de obicei necesară deoarece REORGANIZE efectuează elementele esențiale ale unei reconstrucții în fundal ca operație online.

    pentru exemple de sintaxă, consultați Exemple: columnstore rebuild.

permisiuni

necesită ALTER permisiunea pe masă sau vizualizare. Utilizatorul trebuie să fie membru al cel puțin unuia dintre următoarele roluri:

  • db_ddladmin database rol 1
  • db_owner database rol
  • sysadmin Server rol

1db_ddladmin database rol este cel mai puțin privilegiat.

eliminați fragmentarea folosind SQL Server Management Studio

pentru a reorganiza sau reconstrui un index

  1. În Object Explorer, extindeți baza de date care conține tabelul pe care doriți să reorganizați un index.
  2. extindeți folderul tabele.
  3. extindeți tabelul pe care doriți să reorganizați un index.
  4. extindeți folderul indexuri.
  5. faceți clic dreapta pe indexul pe care doriți să îl reorganizați și selectați reorganizați.
  6. în caseta de dialog reorganizare indexuri, verificați dacă indexul corect se află în grila indexuri de reorganizat și faceți clic pe OK.
  7. bifați caseta de selectare date coloană obiect mare Compact pentru a specifica faptul că toate paginile care conțin date obiect mare (LOB) sunt, de asemenea, compactate.
  8. Faceți clic pe OK.

pentru a reorganiza toate indexurile dintr-un tabel

  1. În Object Explorer, extindeți baza de date care conține tabelul pe care doriți să reorganizați indexurile.
  2. extindeți folderul tabele.
  3. extindeți tabelul pe care doriți să reorganizați indexurile.
  4. faceți clic dreapta pe folderul indexuri și selectați reorganizați toate.
  5. în caseta de dialog reorganizați indexurile, verificați dacă indexurile corecte se află în indexurile care urmează să fie reorganizate. Pentru a elimina un index din grila indexuri care urmează să fie reorganizate, selectați indexul și apoi apăsați tasta ștergere.
  6. bifați caseta de selectare date coloană obiect mare Compact pentru a specifica faptul că toate paginile care conțin date obiect mare (LOB) sunt, de asemenea, compactate.
  7. Faceți clic pe OK.

pentru a reconstrui un index

  1. În Object Explorer, extindeți baza de date care conține tabelul pe care doriți să reorganizați un index.
  2. extindeți folderul tabele.
  3. extindeți tabelul pe care doriți să reorganizați un index.
  4. extindeți folderul indexuri.
  5. faceți clic dreapta pe indexul pe care doriți să îl reorganizați și selectați Rebuild.
  6. în Rebuild Indexes caseta de dialog, verificați dacă indexul corect se află în grila indexuri de reconstruit și faceți clic pe OK.
  7. bifați caseta de selectare date coloană obiect mare Compact pentru a specifica faptul că toate paginile care conțin date obiect mare (LOB) sunt, de asemenea, compactate.
  8. Faceți clic pe OK.

eliminați fragmentarea folosind Transact-SQL

notă

Pentru mai multe exemple despre utilizarea Transact-SQL pentru a reconstrui sau reorganiza indexurile, consultați ALTER Index Examples: Columnstore Indexes și ALTER INDEX Examples: Rowstore Indexes.

pentru a reorganiza un index fragmentat

următorul exemplu reorganizează IX_Employee_OrganizationalLevel_OrganizationalNode index pe HumanResources.Employee tabel în AdventureWorks2016 baza de date.

ALTER INDEX IX_Employee_OrganizationalLevel_OrganizationalNode ON HumanResources.Employee REORGANIZE;

următorul exemplu reorganizează IndFactResellerSalesXL_CCI columnstore index pe dbo.FactResellerSalesXL_CCI tabel în AdventureWorksDW2016 baza de date.

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

pentru a reorganiza toate indexurile dintr-un tabel

următorul exemplu reorganizează toate indexurile dinHumanResources.Employee tabel dinAdventureWorks2016 baza de date.

ALTER INDEX ALL ON HumanResources.Employee REORGANIZE;

pentru a reconstrui un index fragmentat

următorul exemplu reconstruiește un singur index peEmployee tabel înAdventureWorks2016 baza de date.

ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.EmployeeREBUILD;

pentru a reconstrui toate indexurile dintr-un tabel

următorul exemplu reconstruiește toate indexurile asociate tabelului dinAdventureWorks2016 baza de date folosindALL cuvânt cheie. Sunt specificate Trei opțiuni.

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

pentru mai multe informații, consultați ALTER INDEX (Transact-SQL).

managementul automat al indexului și statisticilor

folosiți soluții precum Adaptive Index Defrag pentru a gestiona automat defragmentarea indexului și actualizările de statistici pentru una sau mai multe baze de date. Această procedură alege automat dacă să reconstruiască sau să reorganizeze un index în funcție de nivelul său de fragmentare, printre alți parametri, și să actualizeze statisticile cu un prag liniar.

considerații specifice reconstruirii indexurilor rowstore

reconstruirea unui index grupat reconstruiește automat orice index nonclustered care face referire la cheia de grupare, dacă identificatorii fizici sau logici conținuți în înregistrările indexului nonclustered trebuie să se schimbe.

următoarele scenarii forța Toate indici nonclustered rowstore pe un tabel pentru a fi reconstruit în mod automat:

  • crearea unui index pus în cluster pe un tabel
  • eliminarea unui index pus în cluster, ceea ce face ca tabelul să fie stocat ca un heap
  • schimbarea cheii de grupare pentru a include sau exclude coloanele

următoarele scenarii nu necesită ca toate indexurile nonclustered rowstore să fie reconstruite automat:

  • reconstruirea unui index unic pus în cluster
  • reconstruirea unui index non-unic pus în cluster
  • schimbarea schemei indexului, cum ar fi aplicarea unei scheme de partiționare la un index pus în cluster sau mutarea indexului pus în cluster la un alt grup de fișiere

Important

un index nu poate fi reorganizat sau reconstruit dacă grupul de fișiere în care este localizat este offline sau setat la numai în citire. Când cuvântul cheie ALL este specificat și unul sau mai mulți indici se află într-un grup de fișiere offline sau numai în citire, instrucțiunea eșuează.

în timp ce apare o reconstrucție a indexului, suportul fizic trebuie să aibă suficient spațiu pentru a stoca două copii ale indexului. Când reconstruirea este terminată, motorul bazei de date șterge indexul original.

cândALL este specificat cuALTER INDEX, indexurile relaționale, atât grupate, cât și neclasificate, și indexurile XML de pe tabel sunt reorganizate.

considerații specifice reconstruirii unui index columnstore

când reconstruiți un index columnstore, motorul bazei de date citește toate datele din indexul columnstore original, inclusiv magazinul delta. Acesta combină datele în noi rowgroups, și comprimă rowgroups în columnstore. Motorul bazei de date defragmentează columnstore prin ștergerea fizică a rândurilor care au fost șterse logic din tabel. Octeții șterși sunt recuperați pe disc.

notă

reorganizarea un index columnstore folosind Management Studio va combina rowgroups comprimate împreună, dar nu forțează toate rowgroups să fie comprimat în columnstore. Grupurile de rânduri închise vor fi comprimate, dar grupurile de rânduri deschise nu vor fi comprimate în columnstore.To comprimați forțat toate grupurile de rânduri, utilizați exemplul Transact-SQL de mai jos.

notă

începând cu SQL Server 2019 (15.x), tuple-mover este ajutat de o sarcină de îmbinare a fundalului care comprimă automat grupuri de rânduri delta deschise mai mici care au existat de ceva timp, determinate de un prag intern, sau îmbină grupuri de rânduri comprimate de unde a fost șters un număr mare de rânduri. Acest lucru îmbunătățește calitatea indexului columnstore în timp.
pentru mai multe informații despre termenii și conceptele columnstore, consultați indici Columnstore: Prezentare generală.

reconstruiți o partiție în locul întregului tabel

  • reconstruirea întregului tabel durează mult dacă indexul este mare și necesită suficient spațiu pe disc pentru a stoca o copie suplimentară a indexului în timpul reconstruirii. De obicei, este necesar doar să reconstruiți partiția cea mai recent utilizată.
  • pentru tabele partiționate, nu aveți nevoie pentru a reconstrui întregul index columnstore deoarece fragmentarea este probabil să apară numai în partițiile care au fost modificate recent. Tabelele de fapt și tabelele de dimensiuni mari sunt de obicei partiționate pentru a efectua operațiuni de backup și gestionare pe bucăți de tabel.

reconstruiți o partiție după operații grele DML

reconstruirea unei partiții defragmentează partiția și reduce stocarea pe disc. Reconstruirea șterge toate rândurile din columnstore care sunt marcate pentru ștergere și mută toate grupurile de rânduri din magazinul delta în columnstore. Pot exista mai multe grupuri de rânduri în magazinul delta care au mai puțin de un milion de rânduri.

reconstruiți o partiție după încărcarea datelor

reconstruirea unei partiții după data încărcării asigură stocarea tuturor datelor în columnstore. Când procesele concurente încarcă fiecare mai puțin de 100.000 de rânduri în aceeași partiție în același timp, partiția poate ajunge cu mai multe magazine delta. Reconstruirea mută toate rândurile magazinului delta în columnstore.

considerații specifice reorganizării unui index columnstore

când reorganizați un index columnstore, motorul bazei de date comprimă fiecare grup de rânduri Delta închis în columnstore ca grup de rânduri comprimat. Începând cu SQL Server 2016 (13.x) și în Azure SQL Database, comanda REORGANIZE efectuează online următoarele optimizări suplimentare de defragmentare:

  • elimină fizic rândurile dintr-un grup de rânduri atunci când 10% sau mai multe dintre rânduri au fost șterse logic. Octeții șterși sunt recuperați pe suportul fizic. De exemplu, dacă un grup de rând comprimat de 1 milion de rânduri are 100K rânduri șterse, SQL Server va elimina rândurile șterse și recomprima rowgroup cu 900k rânduri. Se salvează pe spațiul de stocare prin eliminarea rânduri șterse.

  • combină unul sau mai multe grupuri de rânduri comprimate pentru a crește rândurile pe grup de rânduri până la maximum 1.048.576 rânduri. De exemplu, dacă importați în vrac 5 loturi de 102.400 de rânduri, veți primi 5 grupuri de rânduri comprimate. Dacă executați reorganizați, aceste grupuri de rânduri vor fi îmbinate în 1 grup de rânduri comprimat de dimensiune 512.000 de rânduri. Aceasta presupune că nu au existat limitări ale dimensiunii dicționarului sau ale memoriei.

  • pentru grupuri de rânduri în care 10% sau mai multe rânduri au fost șterse logic, motorul bazei de date încearcă să combine acest grup de rânduri cu unul sau mai multe grupuri de rânduri. De exemplu, rowgroup 1 este comprimat cu 500.000 de rânduri și rowgroup 21 este comprimat cu maximum 1.048.576 rânduri. Rowgroup 21 are 60% din rândurile șterse, ceea ce lasă 409.830 de rânduri. Motorul bazei de date favorizează combinarea acestor două grupuri de rânduri pentru a comprima un nou grup de rânduri care are 909.830 de rânduri.

după efectuarea încărcărilor de date, puteți avea mai multe grupuri de rânduri mici în magazinul delta. Puteți utiliza ALTER INDEX REORGANIZE pentru a forța toate grupurile de rânduri în columnstore și apoi pentru a combina grupurile de rânduri în mai puține grupuri de rânduri cu mai multe rânduri. Operațiunea de reorganizare va elimina, de asemenea, rândurile care au fost șterse din columnstore.

limitări și restricții

indici Rowstore cu mai mult de 128 de extensii sunt reconstruite în două faze separate: logică și fizică. În faza logică, unitățile de alocare existente utilizate de index sunt marcate pentru dealocare, rândurile de date sunt copiate și sortate, apoi mutate în noi unități de alocare create pentru a stoca indexul reconstruit. În faza fizică, unitățile de alocare marcate anterior pentru delocare sunt eliminate fizic în tranzacții scurte care se întâmplă în fundal și nu necesită multe blocări. Pentru mai multe informații despre extensii, consultați Ghidul de arhitectură pagini și extensii.

instrucțiuneaALTER INDEX REORGANIZE necesită ca fișierul de date care conține indexul să aibă spațiu disponibil, deoarece operația poate aloca doar pagini de lucru temporare în același fișier, nu într-un alt fișier din grupul de fișiere. Deci, deși filegroup ar putea avea pagini gratuite disponibile, utilizatorul poate întâlni în continuare eroarea 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.

avertisment

crearea și reconstruirea indexurilor nealiniate pe un tabel cu mai mult de 1.000 de partiții este posibilă, dar nu este acceptată. Acest lucru poate provoca performanțe degradate sau consum excesiv de memorie în timpul acestor operații. Microsoft recomandă utilizarea indexurilor aliniate numai atunci când numărul de partiții depășește 1.000.

un index nu poate fi reorganizat sau reconstruit dacă grupul de fișiere în care se află este offline sau setat la numai citire. Când cuvântul cheie ALL este specificat și unul sau mai mulți indici sunt într-un grup de fișiere offline sau numai în citire, instrucțiunea eșuează.

statistici:

  • când un index este creat sau reconstruit, Statisticile sunt create sau actualizate prin scanarea tuturor rândurilor din tabel. Cu toate acestea, începând cu SQL Server 2012 (11.x), Statisticile nu sunt create sau actualizate prin scanarea tuturor rândurilor din tabel atunci când este creat sau reconstruit un index partiționat. În schimb, Optimizatorul de interogări utilizează algoritmul de eșantionare implicit pentru a genera aceste statistici. Pentru a obține statistici privind indexurile partiționate scanând toate rândurile din tabel, utilizați Creați statistici sau actualizați statistici cu clauzaFULLSCAN.

  • când un index este reorganizat, Statisticile nu sunt actualizate.

un index nu poate fi reorganizat cândALLOW_PAGE_LOCKS este setat la Dezactivat.

până la SQL Server 2017 (14.x), reconstruirea unui index columnstore grupat este o operație offline. Motorul bazei de date trebuie să achiziționeze o blocare exclusivă pe masă sau partiție în timp ce are loc reconstrucția. Datele sunt offline și indisponibil în timpul reconstrui chiar și atunci când se utilizează NOLOCK, read-committed instantaneu izolare (RCSI), sau instantaneu izolare.Începând cu SQL Server 2019 (15.X), un index columnstore grupat poate fi reconstruit folosind ONLINE = ON opțiune.

pentru un tabel Azure Synapse Analytics (anterior Azure Synapse Analytics) cu un index columnstore ordonat grupat,ALTER INDEX REBUILD va sorta din nou datele folosind TempDB. Monitorizați TempDB în timpul operațiunilor de reconstrucție. Dacă aveți nevoie de mai mult spațiu TempDB, scalați depozitul de date. Scale înapoi în jos odată ce indicele reconstrui este completă.

pentru un tabel Azure Synapse Analytics (anterior Azure Synapse Analytics) cu un index columnstore ordonat grupat,ALTER INDEX REORGANIZE nu sortează din nou datele. Pentru a recurge la utilizarea datelor ALTER INDEX REBUILD.

utilizarea index REBUILD pentru a recupera de la defecțiuni hardware

în versiunile anterioare de SQL Server, ai putea reconstrui uneori un index nonclustered rowstore pentru a corecta inconsecvențele cauzate de defecțiuni hardware.Începând cu SQL Server 2008, este posibil să puteți repara astfel de neconcordanțe între index și indexul pus în cluster prin reconstruirea unui index nonclustered offline. Cu toate acestea, nu puteți repara inconsecvențele indexului nonclustered prin reconstruirea indexului online, deoarece mecanismul de reconstrucție online folosește indexul nonclustered existent ca bază pentru Reconstrucție și, astfel, persistă inconsecvența. Reconstruirea indexului offline poate forța uneori o scanare a indexului grupat (sau heap) și astfel poate elimina inconsecvența. Pentru a asigura o reconstrucție din indicele grupat, picătură și recrea indicele nonclustered. Ca și în cazul versiunilor anterioare, vă recomandăm să recuperați din inconsecvențe prin restaurarea datelor afectate dintr-o copie de rezervă; cu toate acestea, este posibil să puteți repara inconsecvențele indexului reconstruind indexul nonclustered offline. Pentru mai multe informații, consultați DBCC CHECKDB (Transact-SQL).

Vezi și

  • SQL Server Index Architecture and Design Guide
  • efectuați operațiuni de Index Online
  • ALTER INDEX (Transact-SQL)
  • Adaptive Index Defrag
  • creați statistici (Transact-SQL)
  • actualizați Statisticile (Transact-SQL)
  • Columnstore indexes Query Performance
  • începeți cu Columnstore analiza operațională a timpului
  • indici columnstore pentru depozitarea datelor
  • indici columnstore și Politica de îmbinare pentru grupuri de rânduri

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *