Rebuild indexů online MS SQL 2005

Databázové indexy jsou speciální datové struktury, které úzce souvisejí s tabulkami (někdy i s pohledy – views). Databázový engine je účinně používá k vyhledávání a řazení dat – indexy jsou nezbytné pro rychlé výsledky SQL dotazů odesílaných do databázového engine. Jak jsou v čase modifikována data v tabulkách databáze a tím aktualizovány indexy, stávají se čím dál tím více fragmentovanými. Fragmentace indexu znamená že logické řazení indexu nekorespodnuje s fyzickým uložením dat v databázi. Čím více je index fragmetován, tím více se ztrácí výkon databázového stroje a rychlost zpracování SQL dotazů. V tomto případě je třeba použít buď reorganizaci nebo rebuild indexu.


Reorganizace vs. rebuild
Fragmentované indexy mohou být opraveny dvěma způsoby: mohou být reorganizovány nebo rebuildovány. Reorganizování indexu způsobí přeskupení dat uvnitř vnějších datových stránek a komprimaci indexu. Žádné další informace nejsou modifikovány, takže index může zůstat po reorganizaci fragmentovaný. Operace nevezme příliš mnoho prostředků a může být provedena i při přístupu ostatních procesů k tabulce a indexu, takže se jedná o “online” operaci.
Rebuild indexu pracuje v podstatě tak, že zruší (dropne) daný index a vytvoří jej celý znovu. Tím se samozřejmě také odstraní jakákoli fragmentace původního indexu, protože fyzické řazení u nově vytvořeného indexu koresponduje s logickým řazením. Protože při rebuildu dochází k úplnému odebrání indexu, ostatní procesy jej nemohou použít a tím může dojít k rapidnímu snížení databázového výkonu (zejména u velkých tabulek). Navíc po celou dobu vytváření nového indexu nemohou přistupující procesy uzamknout tabulku, což je zásadní nevýhoda rebuildu databázových indexů.

Online rebuild indexů
S verzí MS SQL 2005 přichází nová možnost rebuild indexů online, což znamená, že v době rebuildování mohou ostatní procesy plně přistupovat k tabulce i k indexu. Proto nejsme omezeni na rebuild jen v době, kdy je databáze méně vytížena.
Aby mohl SQL server rebuildovat index online a zároveň k němu povolit přístup, musí provést určité kroky. Původní index zůstavá stále funkční pro čtení a modifikaci dat s tím, že row versioning (také novinka v MS SQL 2005) zajišťuje transakční konzistenci dat. Nový index vzniká tak, že se jeví jako jeho původní verze. Všechny modifikace dat se v době rebuildu zapisují jak do původního indexu tak i do nově vytvářeného, který se v tuto dobu nepoužívá pro čtení, ale výhradně pro zápis. Protože oba indexy existují v jednu dobu, je nutné počítat s dvojnásobnou spotřebou diskového prostoru. Jakmile je online rebuild indexu dokončen, všechny další požadavky jsou již směřovány do nového indexu a původní je odstraněn.


Příklady
Zpracování online rebuildu se příliš neliší od časo používaných metod rebuildu indexů. Nejjednodušší cesta k rebuildu indexu je příkaz DROP INDEX následovaný příkazem CREATE INDEX. Ovšem rebuild tímto způsobem ponechává tabulku zcela bez indexu až do kompletního vytvoření nového indexu (což může trvat v některých případech i desítky minut). Z toho důvodu (a spousty dalších) není dropnutí a nové vytvoření indexu doporučováno.
Namísto toho můžeme použít klauzuli CREATE INDEX s možností DROP_EXISTING. Tato možnost umožňuje mimo jiné také přesun indexu do jiné souborové skupiny a změnu definice indexu.
Další možností je příkaz ALTER INDEX, který umožňuje rebuild clusterového i neclusterových indexů tabulky. ALTER INDEX neumožnuje změnu definice indexu.
Oba příkazy mohou použít parametry, které definují online rebuild indexu.

Následující příklad provede rebuildu indexu s dropnutím původního, s tím, že rebuild proběhne online bez výpadku přístupu k indexu (možnost ONLINE = ON):

CREATE CLUSTERED INDEX cl_SalesHistory_SaleID ON SalesHistory(SaleID)
WITH(DROP_EXISTING = ON, ONLINE = ON)

Příklad rebuildu všech indexů tabulky (jak jinak, než online):

ALTER INDEX ALL ON SalesHistory
REBUILD WITH(ONLINE = ON)

zdroj: techrepublic

Štítky: , , ,

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

*