SQL Server - Kiedy używać indeksu klastrowego, a kiedy nieklastrowego?

99

Znam podstawowe różnice między indeksami klastrowymi i nieklastrowymi i rozumiem, jak faktycznie działają. Rozumiem, jak indeksy klastrowe i nieklastrowe poprawiają wydajność odczytu. Ale nie jestem pewien, jakie byłyby powody, dla których wybrałbym jedną z nich.

Na przykład: jeśli tabela nie ma indeksu klastrowego, czy należy utworzyć indeks nieklastrowy i jakie są korzyści z tego

armulator
źródło
3
Dziękuję za odpowiedź. Jestem tego już świadomy. Moje pytanie jest tam będzie sytuacji, w której tworzeniu indeksu nieklastrowanym będzie korzystać więcej niż stworzenie indeksu klastrowego
armulator
2
Tak, należy unikać indeksów klastrowych, kiedy; kolumna ma niską liczność, nie ma określonej kolejności, często aktualizowana, niesekwencyjna, jest złożeniem wielu kolumn ...
TI
Dziękuję za odpowiedź. Jego pomocne
armulator
1
Być może to pytanie by ci pomogło: stackoverflow.com/questions/5070529/…
David García González
Możliwy duplikat W której kolumnie należy umieścić indeks klastrowy?
Michael Freidgeim,

Odpowiedzi:

117

Chcę tylko dodać słowo ostrzeżenia: proszę bardzo ostrożnie wybrać indeks klastrowy! Każda „zwykła” tabela danych powinna mieć indeks klastrowy, ponieważ posiadanie indeksu klastrowego rzeczywiście przyspiesza wiele operacji - tak, przyspiesz , a nawet wstawia i usuwa! Ale tylko wtedy, gdy wybierzesz dobry indeks klastrowy.

Jest to najbardziej replikowana struktura danych w bazie danych SQL Server. Klucz klastrowy będzie również częścią każdego indeksu nieklastrowego w tabeli.

Należy zachować szczególną ostrożność podczas wybierania klucza klastrowego - powinien to być:

  • wąskie (idealne 4 bajty)

  • unikalny (w końcu to „wskaźnik wiersza”. Jeśli nie uczynisz go unikatowym, SQL Server zrobi to za Ciebie w tle, kosztując kilka bajtów za każdy wpis pomnożony przez liczbę wierszy i liczbę indeksów nieklastrowych masz - to może być bardzo kosztowne!)

  • statyczny (nigdy nie zmieniaj - jeśli to możliwe)

  • idealnie stale rosnący, więc nie skończy się z okropną fragmentacją indeksu (identyfikator GUID jest całkowitym przeciwieństwem dobrego klucza klastrowego - z tego konkretnego powodu)

  • powinien być bez wartości null, a najlepiej również o stałej szerokości - a varchar(250)jest bardzo słabym kluczem do grupowania

Wszystko inne powinno być naprawdę drugim i trzecim poziomem ważności za tymi punktami ...

Zobacz niektóre posty Kimberly Tripp ( Królowej indeksowania ) na ten temat - wszystko, co napisała na swoim blogu, jest absolutnie bezcenne - przeczytaj to, przetraw - żyj zgodnie z tym!

marc_s
źródło
1
Dzięki marc_s za jasne wyjaśnienie. Ale technicznie rzecz biorąc, co robi non clustereddla nas indeks. jakie jest jego znaczenie ..?
hud
@nad: dobrze dobrany indeks nieklastrowy może przyspieszyć wyszukiwanie - zamiast porównywać potencjalnie miliony wierszy danych z kryteriami wyszukiwania, możesz znaleźć dany wiersz z zaledwie 4, 5 porównaniami. To robi OGROMNĄ różnicę!
marc_s
1
@MuriloKunze: przeczytaj wpis na blogu Kim Tripp na ten temat - wyjaśnia szczegółowo, dlaczego tak jest
marc_s
5
Przykro mi, ale gdzie jest odpowiedź na pytanie „SQL Server - Kiedy używać indeksu klastrowego, a kiedy nieklastrowego?” ?
Eduard