sql >> Databáze >  >> RDS >> Sqlserver

Snížit fragmentaci tabulek serveru SQL Server bez přidání/vypuštění seskupeného indexu?

Problém

Pojďme si to ujasnit, protože toto je běžný problém, vážný problém pro každou společnost používající SQL Server.

Tento problém a potřeba CREATE CLUSTERED INDEX jsou nepochopeny.

Souhlasili jsme s tím, že mít stálý Clustered Index je lepší než ho nemít. Ale o to nejde a stejně to povede k dlouhé diskusi, takže to nechme stranou a soustřeďme se na zaslanou otázku.

Jde o to, že na Hromadě máte značnou fragmentaci . Stále tomu říkáte „tabulka“, ale na úrovni fyzického úložiště dat nebo DataStructure nic takového neexistuje. Tabulka je logický koncept, nikoli fyzický. Je to kolekce fyzických datových struktur. Kolekce je jednou ze dvou možností:

  • Hromadu
    plus všechny neshlukované indexy
    plus textové/obrázkové řetězce

  • nebo Clustered Index
    (eliminuje haldu a jednu Neshlukovaný index)
    plus všechny neshlukované indexy
    plus textové/obrázkové řetězce.

Hromady se špatně fragmentují; čím více rozptýlených (náhodných) položek Vložit/Odstranit/Aktualizovat, tím větší fragmentace.

Neexistuje žádný způsob, jak vyčistit haldu, jak je. MS neposkytuje zařízení (jiní prodejci ano).

Řešení

Víme však, že Create Clustered Index zcela přepisuje a přeskupuje haldu. Metodou (ne trikem) je proto vytvořit seskupený index pouze za účelem defragmentace haldy a poté jej upusťte. Potřebujete volné místo v db table_size x 1,25.

Když už jste u toho, rozhodně použijte FILLFACTOR ke snížení budoucnosti fragmentace. Halda pak zabere více přiděleného místa, což umožňuje budoucí vkládání, odstraňování a rozšiřování řádků kvůli aktualizacím.

Poznámka

  1. Všimněte si, že existují tři Úrovně fragmentace; toto se týká pouze úrovně III, fragmentace v rámci haldy, která je způsobena Nedostatkem klastrovaného indexu

  2. Jako samostatný úkol, někdy jindy, možná budete chtít uvažovat o implementaci trvalého Clustered Index, který zcela eliminuje fragmentaci ... ale to je oddělené od zveřejněného problému.

Odpověď na komentář

Ne tak docela. Neříkal bych tomu "omezení".

  1. Metodou, kterou jsem použil k odstranění Fragmentace v haldě, je vytvořit seskupený index a poté jej zahodit. Tj. dočasně, jehož jediným účelem je správná Fragmentace.

  2. Implementace seskupeného indexu do tabulky (trvale) je mnohem lepším řešením, protože snižuje celkově Fragmentace (DataStructure se stále může Fragmentovat, podrobné informace naleznete v odkazech níže), což je mnohem méně než Fragmentace, ke které dochází v haldě.

    • Každá tabulka v relační databázi (kromě tabulek typu „spojka“ nebo „fronta“) by měla mít seskupený index, aby bylo možné využít jeho různých výhod.

    • Clustered Index by měl být ve sloupcích, které distribuují data (aby nedocházelo ke konfliktům INSERT), nikdy by neměl být indexován v monotónně rostoucím sloupci, jako je Record ID , které zaručuje INSERT Hot Spot na poslední stránce.

V MS SQL a Sybase ASE existují tři Úrovně fragmentace a v rámci každé úrovně několik různých typů . Mějte na paměti, že když se zabýváme Fragmentací, musíme se zaměřit na DataStructures, nikoli na tabulky (tabulka je kolekce DataStructures, jak je vysvětleno výše). Úrovně jsou:

  • Úroveň I • Extra-DataStructure
    Mimo příslušnou DataStructure, napříč nebo v rámci databáze.

  • Úroveň II • DataStructure
    V rámci příslušné DataStructure nad stránkami (na všech stránkách)
    Toto je úroveň, kterou DBA nejčastěji řeší.

  • Stránka úrovně III
    V rámci příslušné DataStructure, na stránkách

Tyto odkazy poskytují úplné podrobnosti o fragmentaci. Jsou specifické pro Sybase ASE, ale na strukturální úrovni se informace týkají MS SQL.

Všimněte si, že metoda, kterou jsem uvedl, je Úroveň II, opravuje Fragmentaci úrovně II a III.



  1. Potřebujete pomoc s převodem data ve formátu 20120130 na datový typ data oracle sql

  2. Jak zkrátíte všechny tabulky v databázi pomocí TSQL?

  3. Oracle získá hodnotu kontrolního součtu pro datový blok definovaný klauzulí select

  4. Jak používat mnoho operátorů LIKE a používat index