Resolve index fragmentation by reorganizing or rebuilding indexes

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

Applies to: igenSQL Server (minden támogatott verzió) IgenAzure SQL Database IgenAzure SQL felügyelt példány igenAzure Synapse igenpárhuzamos adattárház

Ez a cikk leírja, hogy az index töredezettségmentesítése hogyan történik, és tárgyalja annak hatását a lekérdezés teljesítményére. Miután meghatározta az indexhez létező töredezettség mértékét, töredezettségmentesítheti az indexet egy index átszervezésével vagy egy index újjáépítésével a választott eszköz Transact-SQL parancsainak futtatásával vagy az SQL Server Management Studio használatával.

Index töredezettség áttekintés

Mi index töredezettség-miért kéne engem érdekel:

  • Töredezettség létezik, amikor indexek vannak oldalak, ahol a logikai rendelési belül az index alapján a legfontosabb érték az index nem egyezik meg a fizikai rendelési be az index oldalt.
  • Az adatbázis motor automatikusan módosítja az indexeket, amikor a mögöttes adatokra beszúrják, frissítik vagy törlik a műveleteket. Például a táblázat sorainak hozzáadása a rowstore indexek meglévő oldalainak megosztását okozhatja, hogy helyet biztosítson az új kulcsértékek beillesztéséhez. Idővel ezek a módosítások miatt az indexben lévő információk szétszóródnak az adatbázisban (töredezett). Fragmentáció akkor létezik, ha az indexek olyan oldalakkal rendelkeznek, amelyekben a logikai megrendelés a kulcsérték alapján nem egyezik meg az adatfájl fizikai megrendelésével.
  • az erősen fragmentált indexek ronthatják a lekérdezési teljesítményt, mivel további I / O-ra van szükség az adatok megkereséséhez, amelyekre az index mutat. Több I / O hatására az alkalmazás lassan reagál, különösen akkor, ha a szkennelési műveletek részt vesznek.

a töredezettség mennyiségének kimutatása

az első lépés annak eldöntésében, hogy melyik index töredezettségmentesítési módszert kell használni, az index elemzése a töredezettség mértékének meghatározásához. A rowstore indexek és a columnstore indexek esetében eltérő módon érzékeli a töredezettséget.

Megjegyzés

különösen fontos az index vagy a halom töredezettségének áttekintése a nagy mennyiségű adat törlése után. A halmok esetében, ha gyakori frissítések vannak, szükség lehet a töredezettség felülvizsgálatára is, hogy elkerüljük a továbbítási rekordok elterjedését. További információ a halmok, lásd halmok (táblázatok nélkül fürtözött indexek).

a rowstore indexek töredezettségének észlelése

sys használatával.dm_db_index_physical_stats, akkor érzékeli töredezettség egy adott index, az összes indexek egy táblázatban vagy indexelt nézet, az összes indexek egy adatbázisban, vagy az összes indexek az összes adatbázisban. Particionált indexek esetén a sys. dm_db_index_physical_stats az egyes partíciókhoz fragmentációs információkat is nyújt.

a sys.dm_db_index_physical_stats által visszaadott eredményhalmaz a következő oszlopokat tartalmazza:

oszlop leírás
avg_fragmentation_in_percent a logikai töredezettség százaléka (Out-of-order oldalak az indexben).
fragment_count a töredékek száma (fizikailag egymást követő levéloldalak) az indexben.
avg_fragment_size_in_pages átlagos oldalak száma egy töredék egy index.

miután a töredezettség mértéke ismert, használja a következő táblázatot a fragmentáció eltávolításának legjobb módszerének meghatározásához: INDEX átszervezése vagy 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 és ALTER INDEX REBUILD. A tényleges értékek azonban esetenként változhatnak. Fontos, hogy kísérletezzen a környezetének legjobb küszöbértékének meghatározására.

Tip

például, ha egy adott indexet elsősorban szkennelési műveletekhez használnak, a töredezettség eltávolítása javíthatja ezen műveletek teljesítményét. A teljesítmény előny nem lehet észrevehető az indexek, amelyek elsősorban a seek műveletek.
hasonlóképpen, eltávolítása töredezettség egy kupacban (a táblázat nem fürtözött index) különösen hasznos a nem zárolt index scan műveletek, de kevés hatással lookup műveletek.

2. Az index átszervezése mindig online történik. A reorganize opcióhoz hasonló elérhetőség elérése érdekében újra kell építenie az indexeket online. További információ: INDEX és index műveletek Online végrehajtása.

az 5 százaléknál kisebb töredezettségű indexeket nem kell töredezettségmentesíteni, mivel az ilyen kis mennyiségű töredezettség eltávolításának előnyeit szinte mindig nagymértékben felülmúlják az index átszervezéséhez vagy újjáépítéséhez felmerült CPU-költségek. Továbbá, újjáépítése vagy átszervezése kis rowstore indexek általában nem csökkenti a tényleges töredezettség.Akár, beleértve, SQL Server 2014 (12.x), az SQL Server adatbázis-motor vegyes kiterjesztésekkel oszt ki helyet. Ezért a kis indexek oldalait néha vegyes mértékben tárolják. A vegyes kiterjedéseket legfeljebb nyolc objektum osztja meg, így előfordulhat, hogy egy kis index töredezettsége nem csökken az átszervezés vagy az újjáépítés után. Lásd még a Rowstore indexek újjáépítésére vonatkozó megfontolásokat. További információ a bővítményekről a Pages and Extents Architecture Guide oldalon található.

A columnstore indexek töredezettségének észlelése

a sys.dm_db_column_store_row_group_physical_stats használatával meghatározhatja az index törölt sorainak százalékos arányát, ami ésszerű intézkedés a columnstore index sorcsoportjának széttöredezésére. Használja ezt az információt, hogy kiszámolja a töredezettség egy adott index, az összes indexek egy asztalon, az összes indexek egy adatbázisban, vagy az összes indexek az összes adatbázisban.

Az eredmény állítsa vissza sys.dm_db_column_store_row_group_physical_stats tartalmazza az alábbi oszlopok:

Oszlop Leírás
total_rows sorok Száma fizikai tárolja a sorban csoport. Tömörített sorcsoportok esetében ez magában foglalja a törölt sorokat.
deleted_rows a törlésre kijelölt tömörített sorcsoportban fizikailag tárolt sorok száma. 0 a delta áruházban lévő sorcsoportok esetében.

használja ezt az információt vissza compute index fragmentáció segítségével ezt a képletet:

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

miután a mértéke index töredezettség ismert, használja a következő táblázatot, hogy meghatározza a legjobb módszer, hogy távolítsa el a töredezettség: INDEX átszervezése vagy 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 REORGANIZE

a Rowstore index fragmentációjának ellenőrzése Transact-SQL

a következő példa a HumanResources.Employee táblázat a AdventureWorks2016 adatbázisban.

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

az előző utasítás a következőhöz hasonló eredményt ad vissza.

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)

további információkért lásd: sys.dm_db_index_physical_stats.

egy columnstore index fragmentációjának ellenőrzése a Transact-SQL

használatával a következő példa az összes index átlagos fragmentációs százalékát találja a dbo.FactResellerSalesXL_CCI táblázatban a AdventureWorksDW2016 adatbázisban.

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;

az előző utasítás a következőhöz hasonló eredményt ad vissza.

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

Check index fragmentáció segítségével SQL Server Management Studio

Megjegyzés

Management Studio nem lehet kiszámítani töredezettsége columnstore indexek SQL Server, és nem lehet használni, hogy kiszámolja töredezettsége bármely indexek az Azure SQL adatbázisban. Használja az előző Transact-SQL példát.

  1. az objektum Explorerben bontsa ki azt az adatbázist, amely tartalmazza azt a táblázatot, amelyen ellenőrizni szeretné az index töredezettségét.
  2. bontsa ki a táblázatok mappát.
  3. bontsa ki azt a táblázatot, amelyen ellenőrizni szeretné az index töredezettségét.
  4. bontsa ki az indexek mappát.
  5. kattintson a jobb gombbal arra az Indexre, amelyből ellenőrizni szeretné a töredezettséget, majd válassza ki a tulajdonságokat.
  6. alatt Válasszon ki egy oldalt, válassza a töredezettség lehetőséget.

A fragmentációs oldalon a következő információk találhatók:

érték leírás
az oldal teljessége az indexoldalak átlagos teljességét jelzi százalékban. 100% azt jelenti, hogy az index oldalak teljesen tele vannak. 50% azt jelenti, hogy átlagosan minden index oldal félig tele van.
teljes fragmentáció a logikai fragmentációs százalék. Ez jelzi az indexben lévő oldalak számát, amelyek nem sorrendben vannak tárolva.
átlagos sorméret egy levélszintű sor átlagos mérete.
mélység az index szintjeinek száma, beleértve a levélszintet is.
továbbított rekordok a rekordok száma Egy halom, amelyek előre mutató egy másik adat helyét. (Ez az állapot egy frissítés során jelentkezik, amikor nincs elég hely az új sor eredeti helyén történő tárolásához.)
Ghost sorok a törölt, de még nem eltávolított sorok száma. Ezeket a sorokat egy tisztítási szál eltávolítja, amikor a szerver nincs elfoglalva. Ez az érték nem tartalmazza azokat a sorokat, amelyeket a pillanatfelvétel-leválasztási ügylet miatt megtartanak.
Index típus az index típusa. A lehetséges értékek a fürtözött index, a nem zárolt index és az elsődleges XML. A táblázatok kupacként is tárolhatók (indexek nélkül), de ez az Index tulajdonságai oldal nem nyitható meg.
Levélszintű sorok a levélszintű sorok száma.
maximális sorméret a maximális levélszintű sorméret.
minimális sorméret a minimális levélszintű sorméret.
Pages az összes adatoldal.
Partícióazonosító az indexet tartalmazó B-fa partícióazonosítója.
verzió szellem sorok a ghost rekordok száma, amelyeket egy kiemelkedő pillanatfelvétel-elkülönítési tranzakció miatt tartanak fenn.

Töredezettségmentesítő indexek a

index újjáépítésével vagy átszervezésével töredezettségi indexet töredezettségmentesít a következő módszerek egyikével:

  • Index reorganizáció
  • Index újjáépítése

Megjegyzés

partíciós sémára épülő particionált indexekhez a következő módszerek bármelyikét használhatja egy teljes Indexen vagy egy index egyetlen partícióján.

Reorganize an index

Reorganizing an index uses minimal system resources and is an online operation. Ez azt jelenti, hogy a hosszú távú blokkoló táblazár nem kerül tárolásra, és az alapul szolgáló tábla lekérdezése vagy frissítése a ALTER INDEX REORGANIZE tranzakció során folytatódhat.

  • rowstore indexek, az Adatbázis Motor defragments a levél szintű fürtözött pedig nonclustered indexek a táblázatok, nézetek által fizikailag átrendezéséhez a levél szintű oldalak megfelelnek a logikus sorrendben a levél csomópontok (balról jobbra). A reorganizáció az indexoldalakat is tömöríti az index kitöltési tényező értéke alapján. A kitöltési tényező beállításának megtekintéséhez használja a sys-t.indexek. Szintaxis példákat lásd: példák: rowstore reorganize.

  • columnstore indexek használatakor a delta store több kis sorcsoportot is tartalmazhat az adatok beillesztése, frissítése és törlése után. A columnstore index átszervezése az összes sorcsoportot az oszloptárba kényszeríti, majd a sorcsoportokat kevesebb sorcsoportba egyesíti több sorral. A reorganize művelet eltávolítja azokat a sorokat is, amelyeket töröltek a columnstore-ból. Az átszervezés kezdetben további CPU erőforrásokat igényel az adatok tömörítéséhez, ami lelassíthatja a rendszer általános teljesítményét. Azonban, amint az adatok tömörülnek, a lekérdezési teljesítmény javul. Szintaxis példákat lásd példák: ColumnStore reorganize.

újjáépíteni egy index

újraépíteni egy indexcseppet és újra létrehozni az indexet. Attól függően, hogy milyen típusú index és adatbázis motor verzió, újjáépíteni művelet lehet tenni online vagy offline. A T-SQL szintaxishoz lásd: ALTER INDEX REBUILD

  • a rowstore indexek esetében az újjáépítés eltávolítja a töredezettséget, visszaállítja a lemezterületet az oldalak tömörítésével a megadott vagy meglévő kitöltési tényező beállítása alapján, majd átrendezi az indexsorokat egybefüggő oldalakon. Ha aALL meg van adva, akkor az asztalon lévő összes indexet egyetlen tranzakció során ledobják és újraépítik. A külföldi kulcskorlátozásokat nem kell előre csökkenteni. Amikor a 128 vagy annál hosszabb indexeket újraépítik, az adatbázismotor a tranzakciót követően elhalasztja a tényleges oldalelosztásokat, valamint a hozzájuk tartozó zárakat. Szintaxis példákat lásd: példák: rowstore reorganize.

  • a columnstore indexek esetében az újjáépítés eltávolítja a töredezettséget, az összes sort áthelyezi az oszloptárba, majd a logikusan törölt sorok fizikai törlésével visszaszerzi a lemezterületet.

    Tip

    kezdve SQL Server 2016 (13.x), újjáépítése a columnstore index általában nem szükséges, mivel REORGANIZE elvégzi az alapvető egy újjáépíteni a háttérben, mint egy online művelet.

    szintaxis példákhoz lásd a példákat: ColumnStore újjáépítése.

engedélyek

ALTER engedély az asztalon vagy a nézetben. A Felhasználónak a következő szerepkörök legalább egyikének kell lennie:

  • db_dladmin database role 1
  • db_owner database role
  • sysadmin server role

1db_dladmin database role a legkevésbé kiváltságos.

távolítsa el a fragmentációt az SQL Server Management Studio

segítségével az

  1. Index átszervezéséhez vagy újjáépítéséhez az Object Explorerben bontsa ki azt az adatbázist, amely tartalmazza azt a táblázatot, amelyen egy indexet átszervezni szeretne.
  2. bontsa ki a táblázatok mappát.
  3. bontsa ki azt a táblázatot, amelyen egy indexet újra szeretne szervezni.
  4. bontsa ki az indexek mappát.
  5. kattintson a jobb gombbal az átszervezni kívánt indexre, majd válassza a Reorganize lehetőséget.
  6. az indexek átszervezése párbeszédpanelen ellenőrizze, hogy a megfelelő index szerepel-e az újraszervezendő indexek rácsában, majd kattintson az OK gombra.
  7. jelölje be a kompakt nagy objektum oszlop adatainak jelölőnégyzetet annak megadásához, hogy a nagy objektum (LOB) adatokat tartalmazó oldalak is tömörödjenek.
  8. kattintson az OK gombra.

az objektum Explorerben lévő

  1. táblázat összes indexének átszervezéséhez bontsa ki azt az adatbázist, amelyen az indexeket átszervezni szeretné.
  2. bontsa ki a táblázatok mappát.
  3. bontsa ki azt a táblázatot, amelyen az indexeket át szeretné szervezni.
  4. kattintson a jobb gombbal az indexek mappára, majd válassza az összes átszervezése lehetőséget.
  5. az indexek átszervezése párbeszédpanelen ellenőrizze, hogy a megfelelő indexek vannak-e az átszervezendő indexekben. Egy index eltávolításához az átszervezendő indexekből rács Válassza ki az indexet, majd nyomja meg a Törlés gombot.
  6. jelölje be a kompakt nagy objektum oszlop adatainak jelölőnégyzetet annak megadásához, hogy a nagy objektum (LOB) adatokat tartalmazó oldalak is tömörödjenek.
  7. kattintson az OK gombra.

egy

  1. Index újjáépítéséhez az objektum Explorerben bontsa ki azt az adatbázist, amely tartalmazza azt a táblázatot, amelyen egy indexet át szeretne szervezni.
  2. bontsa ki a táblázatok mappát.
  3. bontsa ki azt a táblázatot, amelyen egy indexet újra szeretne szervezni.
  4. bontsa ki az indexek mappát.
  5. kattintson a jobb gombbal az átszervezni kívánt indexre, majd válassza az újjáépítés lehetőséget.
  6. az indexek újjáépítése párbeszédpanelen ellenőrizze, hogy a megfelelő index van-e az újjáépítendő indexek rácsában, majd kattintson az OK gombra.
  7. jelölje be a kompakt nagy objektum oszlop adatainak jelölőnégyzetet annak megadásához, hogy a nagy objektum (LOB) adatokat tartalmazó oldalak is tömörödjenek.
  8. kattintson az OK gombra.

távolítsa el a töredezettséget a Transact-SQL segítségével

Megjegyzés

további példákat a Transact-SQL használatával az indexek újjáépítéséhez vagy átszervezéséhez lásd ALTER INDEX példák: Columnstore indexek és ALTER INDEX példák: Rowstore indexek.

egy fragmentált index átszervezéséhez

a következő példa átszervezi a IX_Employee_OrganizationalLevel_OrganizationalNodeindexet a HumanResources.Employeetáblázatban a AdventureWorks2016 adatbázisban.

ALTER INDEX IX_Employee_OrganizationalLevel_OrganizationalNode ON HumanResources.Employee REORGANIZE;

a következő példa átszervezi a IndFactResellerSalesXL_CCI columnstore index a dbo.FactResellerSalesXL_CCI táblázat a AdventureWorksDW2016 adatbázisban.

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

a

táblázatban szereplő összes index átszervezéséhez a következő példa átszervezi az összes indexet a HumanResources.Employee táblázatban a AdventureWorks2016 adatbázisban.

ALTER INDEX ALL ON HumanResources.Employee REORGANIZE;

egy fragmentált index

újjáépítéséhez a következő példa újraépít egy indexet a Employee táblázatban a AdventureWorks2016 adatbázisban.

ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.EmployeeREBUILD;

az összes index újraépítése egy táblázatban

a következő példa újraépíti a AdventureWorks2016adatbázisba tartozó összes indexet a kulcsszó segítségével. Három lehetőség van megadva.

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

további információkért lásd: ALTER INDEX (Transact-SQL).

automatikus index-és statisztikai menedzsment

olyan tőkeáttételi megoldások, mint például az adaptív Index-Defrag, az index töredezettségmentesítés és a statisztikai frissítések automatikus kezeléséhez egy vagy több adatbázishoz. Ez az eljárás automatikusan eldönti, hogy az indexet a fragmentációs szintje szerint újraépíti-e vagy átszervezi-e, többek között a paraméterek között, és frissíti-e a statisztikákat lineáris küszöbértékkel.

Megfontolások egyedi újjáépítése rowstore indexek

Újjáépítése fürtözött index automatikusan újraépíti bármely nonclustered index ez az utalás a klaszter kulcs, ha a fizikai vagy logikai található azonosítók a nonclustered index nyilvántartást kell változtatni.

a következő forgatókönyvek kényszerítik az összes rowstore nem zárolt indexet az asztalra, hogy automatikusan újjáépítse:

  • Létrehozása fürtözött index egy táblázat
  • Eltávolítása fürtözött index, amelynek hatására a táblázatban kell tárolni, mint egy halom
  • Változó a klaszter kulcs, hogy kizárják vagy oszlop

A következő esetekben nem szükséges az összes rowstore nonclustered indexek automatikusan újjá egy asztalon:

  • Újjáépítése egyedi fürtözött index
  • Újjáépítése egy nem egyedi fürtözött index
  • Változó az index séma, például alkalmazása egy particionáló program fürtözött index, vagy mozog a fürtözött index egy másik filegroup

Fontos

Az index nem újjá, vagy újjá, ha a filegroup, melyben található offline vagy írásvédett. Ha az összes kulcsszó meg van adva, és egy vagy több index offline vagy csak olvasható fájlcsoportban van, a nyilatkozat sikertelen.

amíg egy index újjáépül, a fizikai adathordozónak elegendő helynek kell lennie az index két példányának tárolására. Amikor az újjáépítés befejeződött, az adatbázis-motor törli az eredeti indexet.

amikor ALL a ALTER INDEX utasítás, relációs indexek, mind a fürtözött, mind a nem zárolt, mind az XML indexek az asztalon átszervezésre kerülnek.

A columnstore index

újraépítésekor egy columnstore index, az adatbázis motor beolvassa az összes adatot az eredeti columnstore index, beleértve a delta store. Ez egyesíti az adatokat az új rowgroups, majd tömöríti a rowgroups a columnstore. Az adatbázis motor töredezettségmentesíti a columnstore-t azáltal, hogy fizikailag törli a táblázatból logikusan törölt sorokat. A törölt bájtok visszakerülnek a lemezen.

Megjegyzés

a columnstore index átszervezése a Management Studio segítségével egyesíti a tömörített sorcsoportokat, de nem kényszeríti az összes sorcsoportot tömörítésre a columnstore-ba. Zárt rowgroups lesz tömörítve, de nyitott rowgroups nem lesz tömörítve a columnstore.To erőszakkal tömörítse az összes sorcsoportot, használja az alábbi Transact-SQL példát.

Megjegyzés

kezdve SQL Server 2019 (15.x), a tuple-mover segíti a háttér merge feladat, amely automatikusan tömöríti a kisebb nyitott delta rowgroups, hogy már létezett egy ideig által meghatározott belső küszöböt, vagy összeolvad tömörített rowgroups ahonnan nagy sorok száma törölték. Ez idővel javítja a columnstore index minőségét.
a columnstore kifejezésekkel és fogalmakkal kapcsolatos további információkért lásd: Columnstore indexek: áttekintés.

partíció újjáépítése a teljes táblázat helyett

  • a teljes táblázat újjáépítése hosszú időt vesz igénybe, ha az index nagy, és elegendő lemezterületre van szükség az index további példányának tárolásához az újjáépítés során. Általában csak a legutóbb használt partíció újjáépítésére van szükség.
  • particionált táblázatok esetén nem kell újraépíteni a teljes columnstore indexet, mert a töredezettség valószínűleg csak a közelmúltban módosított partíciókban fordul elő. A ténytáblázatok és a nagy méretű táblázatok általában felosztásra kerülnek annak érdekében, hogy biztonsági mentési és kezelési műveleteket hajtsanak végre az asztal darabjain.

egy partíció újjáépítése nehéz DML műveletek után

egy partíció újjáépítése töredezettségmentesíti a partíciót, és csökkenti a lemez tárolását. Az újjáépítés törli a törlésre kijelölt oszloptárból az összes sort, majd a delta áruházból az összes sorcsoportot áthelyezi a columnstore-ba. A delta áruházban több sorcsoport is lehet, amelyek kevesebb mint egymillió sorral rendelkeznek.

partíció újjáépítése az adatok betöltése után

partíció újjáépítése a betöltési dátum után biztosítja, hogy az összes adat az oszloptárban tárolódjon. Ha egyidejű folyamatok minden terhelés kevesebb, mint 100.000 sor ugyanabban a partícióban ugyanabban az időben, a partíció a végén több delta tárolja. Az újjáépítés az összes delta áruház sort az oszlopba mozgatja.

A columnstore index

átszervezésekor a columnstore index, az adatbázis motor tömöríti minden zárt delta rowgroup a columnstore, mint egy tömörített rowgroup. Kezdve SQL Server 2016 (13.x) az Azure SQL adatbázisban aREORGANIZE parancs a következő további töredezettségmentesítési optimalizálásokat hajtja végre online:

  • fizikailag eltávolítja a sorokat egy sorcsoportból, ha a sorok legalább 10% – át logikusan törölték. A törölt bájtok visszakerülnek a fizikai adathordozón. Ha például egy 1 millió sorból álló tömörített sorcsoport 100k sorral rendelkezik, az SQL Server eltávolítja a törölt sorokat, majd 900k sorokkal tömöríti a sorcsoportot. A törölt sorok eltávolításával megtakarítja a tárolót.

  • egy vagy több tömörített sorcsoportot kombinál, hogy soronként legfeljebb 1 048 576 sorra növelje a sorokat. Például, ha ömlesztett import 5 tétel 102.400 sorok kapsz 5 tömörített rowgroups. Ha fut REORGANIZE, ezek rowgroups kap Egyesült 1 tömörített rowgroup mérete 512,000 sorok. Ez azt feltételezi, hogy nem voltak szótárméret vagy memória korlátozások.

  • azon sorcsoportok esetében, amelyekben a sorok legalább 10% – át logikusan törölték, az adatbázismotor megpróbálja kombinálni ezt a sorcsoportot egy vagy több sorcsoporttal. Például a rowgroup 1-et 500 000 sorral tömörítik, a rowgroup 21-et pedig legfeljebb 1 048 576 sorral tömörítik. A Rowgroup 21 a törölt sorok 60% – át teszi ki, ami 409 830 Sort hagy maga után. Az adatbázis motor kedvez ötvözi a két rowgroups tömöríteni egy új rowgroup, amely 909,830 sorok.

adatterhelés elvégzése után több kis sorcsoport is lehet A delta áruházban. AALTER INDEX REORGANIZE segítségével az összes sorcsoportot az oszloptárba kényszerítheti, majd a sorcsoportokat kevesebb sorcsoportba kombinálhatja több sorral. Az átszervezési művelet eltávolítja az oszloptárból törölt sorokat is.

korlátozások és korlátozások

a 128-nál nagyobb rowstore indexek két külön fázisban épülnek fel: logikai és fizikai. A logikai fázisban az index által használt meglévő elosztóegységeket kijelölik a deallocációra, az adatsorokat lemásolják, rendezik, majd áthelyezik az újjáépített index tárolására létrehozott új elosztóegységekbe. A fizikai fázisban, a kiosztási egységek korábban megjelölt deallocation fizikailag csökkent a rövid tranzakciók történnek a háttérben, és nem igényel sok zárak. További információ a bővítményekről: Pages and Extents Architecture Guide.

a ALTER INDEX REORGANIZE utasítás megköveteli, hogy az indexet tartalmazó adatfájl rendelkezésre álljon, mivel a művelet csak ideiglenes munkalapokat oszthat ki ugyanazon a fájlon, nem pedig egy másik fájlban a fájlcsoporton belül. Tehát bár a filegroup szabad oldalakkal rendelkezik, a felhasználó továbbra is 1105-ös hibával szembesülhet: 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.

figyelmeztetés

nem hozzárendelt indexek létrehozása és újjáépítése több mint 1000 partícióval rendelkező asztalon lehetséges, de nem támogatott. Ez a művelet során csökkent teljesítményt vagy túlzott memóriafogyasztást okozhat. A Microsoft azt javasolja, hogy csak akkor használjon igazított indexeket, ha a partíciók száma meghaladja az 1000-et.

egy indexet nem lehet átszervezni vagy újjáépíteni, ha a fájlcsoport, amelyben található, offline vagy csak olvasható. Ha a ALL kulcsszó meg van adva, és egy vagy több index offline vagy csak olvasható fájlcsoportban van, a nyilatkozat sikertelen.

statisztika:

  • index létrehozásakor vagy újjáépítésekor a statisztika a táblázat összes sorának beolvasásával jön létre vagy frissül. Azonban, kezdve SQL Server 2012 (11.x), a statisztikákat nem hozza létre vagy frissíti a táblázat összes sorának beolvasásával, amikor egy particionált index jön létre vagy újjáépül. Ehelyett a Query Optimizer az alapértelmezett mintavételi algoritmust használja ezen statisztikák előállításához. A particionált indexekre vonatkozó statisztikák megszerzéséhez a táblázat összes sorának beolvasásával használja a statisztikák létrehozása vagy a statisztikák frissítése a FULLSCAN záradékkal.

  • az index átszervezésekor a statisztikák nem frissülnek.

egy indexet nem lehet átszervezni, ha a ALLOW_PAGE_LOCKS ki van kapcsolva.

akár SQL Server 2017 (14.x), újjáépítése fürtözött columnstore index egy offline művelet. Az adatbázis-motornak exkluzív zárat kell szereznie az asztalon vagy a partíción, amíg az újjáépítés megtörténik. Az adatok offline állapotban nem érhetők el az újjáépítés során, még akkor sem, ha NOLOCK, Read-committed Snapshot Isolation (RCSI) vagy Snapshot Isolation.Kezdve SQL Server 2019 (15.x), a fürtözött columnstore index lehet újjáépíteni a ONLINE = ON opciót.

Azure Synapse Analytics (korábban Azure Synapse Analytics) tábla esetén a rendezett fürtözött columnstore index, ALTER INDEX REBUILD az adatokat a TempDB segítségével rendezi újra. Monitor TempDB alatt újjáépíteni műveletek. Ha több TempDB helyre van szüksége, méretezze fel az adattárházat. Skála vissza, ha az index újjáépítése befejeződött.

Azure Synapse Analytics (korábban Azure Synapse Analytics) tábla esetén a rendezett fürtözött columnstore index, ALTER INDEX REORGANIZE nem rendezi újra az adatokat. Ahhoz, hogy igénybe az adatok használata ALTER INDEX REBUILD.

az INDEX újjáépítése a hardverhibák helyreállítása érdekében

az SQL Server korábbi verzióiban néha újraépíthet egy rowstore nem tömörített indexet a hardverhibák által okozott következetlenségek kijavítására.Az SQL Server 2008-tól kezdve az index és a fürtözött index közötti ellentmondásokat még mindig meg lehet javítani egy nem záródó index offline újraépítésével. Az index online újraépítésével azonban nem lehet javítani a nem záródó index-ellentmondásokat, mert az online újjáépítési mechanizmus a meglévő nem záródó indexet használja az újjáépítés alapjaként, így továbbra is fennáll az ellentmondás. Az index offline újjáépítése néha kényszerítheti a fürtözött index (vagy halom) beolvasását, így eltávolíthatja az ellentmondást. Hogy biztosítsa újjáépíteni a fürtözött index, csepp, majd újra a nonclustered index. Mint a korábbi verziók, javasoljuk, lábadozik, következetlenségek visszaállítása az érintett adatokat a mentés; azonban előfordulhat, hogy a javítás az index, következetlenségek újjáépítése a nonclustered index offline. További információ: DBCC CHECKDB (Transact-SQL).

Lásd

  • SQL Server Index Építészeti Tervezési Útmutató
  • Végre Index Műveletek Online
  • ALTER INDEX (Transact-SQL)
  • Adaptív Index Defrag
  • LÉTRE STATISZTIKA (Transact-SQL)
  • STATISZTIKA FRISSÍTÉSE (Transact-SQL)
  • Columnstore Indexek Lekérdezés Teljesítmény
  • induláshoz Columnstore a valós idejű működési analytics
  • Columnstore Indexek az Adatok a Raktározási
  • Columnstore indexek, valamint az egyesítés politika rowgroups

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük