Problem
Wyjaśnijmy to, ponieważ jest to powszechny problem, poważny problem dla każdej firmy korzystającej z SQL Server.
Ten problem i potrzeba UTWÓRZ CLASTERED INDEX jest źle zrozumiany.
Zgadzam się, że posiadanie stałego indeksu klastrowego jest lepsze niż jego brak. Ale nie o to chodzi, a i tak doprowadzi to do długiej dyskusji, więc odłóżmy to na bok i skupmy się na zamieszczonym pytaniu.
Chodzi o to, że masz znaczną fragmentację na Stopie . Ciągle nazywasz to „tabelą”, ale nie ma czegoś takiego na poziomie fizycznego przechowywania danych lub na poziomie DataStructure. Stół jest koncepcją logiczną, a nie fizyczną. Jest to zbiór fizycznych struktur DataStructures. Kolekcja to jedna z dwóch możliwości:
-
Stos
plus wszystkie indeksy nieklastrowane
plus łańcuchy tekst/obraz -
lub indeks klastrowy
(eliminuje stertę i jeden Indeks nieklastrowany)
plus wszystkie indeksy nieklastrowane
plus łańcuchy tekst/obraz.
Sterty są bardzo rozdrobnione; im więcej jest rozłożonych (losowych) wstawek/usuwań/aktualizacji, tym większa fragmentacja.
Nie ma sposobu na posprzątanie sterty, tak jak jest. MS nie zapewnia takiej możliwości (inni dostawcy to robią).
Rozwiązanie
Wiemy jednak, że Create Clustered Index całkowicie przepisuje i zmienia kolejność sterty. Metoda (nie sztuczka) polega zatem na utworzeniu indeksu klastrowego tylko w celu defragmentacji sterty i upuść go później. Potrzebujesz wolnego miejsca w bazie danych o rozmiarze table_size x 1,25.
Kiedy już to robisz, użyj FILLFACTOR, aby zmniejszyć przyszłość podział. Sterta zajmie wtedy więcej przydzielonego miejsca, umożliwiając przyszłe wstawianie, usuwanie i rozwijanie wierszy z powodu aktualizacji.
Uwaga
-
Pamiętaj, że istnieją trzy poziomy fragmentacji; dotyczy to tylko poziomu III, fragmentacji w obrębie sterty, która jest spowodowana brakem indeksu klastrowego
-
Jako oddzielne zadanie, w innym czasie, możesz rozważyć wdrożenie stałego indeksu klastrowego, który całkowicie eliminuje fragmentację ... ale jest to oddzielne od opublikowanego problemu.
Odpowiedź na komentarz
Nie do końca. Nie nazwałbym tego „ograniczeniem”.
-
Metodą, którą podałem, aby wyeliminować fragmentację w stercie, jest utworzenie indeksu klastrowego, a następnie upuszczenie go. Tj. tymczasowo, którego jedynym celem jest poprawna fragmentacja.
-
Zaimplementowanie indeksu klastrowego na stole (na stałe) jest znacznie lepszym rozwiązaniem, ponieważ zmniejsza ogólne Fragmentacja (DataStructure może nadal być pofragmentowana, szczegółowe informacje znajdują się w linkach poniżej), która jest znacznie mniejsza niż fragmentacja występująca w stercie.
-
Każda tabela w relacyjnej bazie danych (z wyjątkiem tabel „potoków” lub „kolejek”) powinna mieć indeks klastrowy, aby móc korzystać z różnych zalet.
-
Indeks klastrowy powinien znajdować się w kolumnach, które dystrybuują dane (unikając konfliktów INSERT), nigdy nie powinien być indeksowany w monotonicznie rosnącej kolumnie, takiej jak Record ID , która gwarantuje INSERT Hot Spot na ostatniej stronie.
-
W MS SQL i Sybase ASE istnieją trzy poziomy fragmentacji, a na każdym poziomie kilka różnych Typów . Należy pamiętać, że zajmując się fragmentacją, musimy skupić się na strukturach danych, a nie na tabelach (tabela jest zbiorem struktur danych, jak wyjaśniono powyżej). Poziomy to:
-
Poziom I • Dodatkowa struktura danych
Poza daną strukturą danych, w obrębie lub w obrębie bazy danych. -
Poziom II • Struktura danych
W ramach danej struktury danych, powyżej stron (na wszystkich stronach)
Jest to poziom najczęściej adresowany przez administratorów baz danych. -
Poziom III • Strona
W ramach odpowiedniej struktury danych, na stronach
Te linki zapewniają pełną szczegółowość ponownej fragmentacji. Są one specyficzne dla Sybase ASE, jednak na poziomie strukturalnym informacje dotyczą MS SQL.
Zauważ, że metoda, którą podałem, to poziom II, koryguje fragmentację na poziomie II i III.