Co się stanie, jeśli indeks klastrowy nie jest unikalny? Czy może to prowadzić do złej wydajności, ponieważ wstawione wiersze wpływają na pewnego rodzaju „przepełnioną” stronę?
Czy jest „stworzony” jako wyjątkowy, a jeśli tak, to w jaki sposób? Jaki jest najlepszy sposób, aby uczynić go wyjątkowym?
Pytam, ponieważ obecnie używam indeksu klastrowego do podzielenia mojej tabeli na części logiczne, ale wydajność jest taka sobie, a ostatnio otrzymałem poradę, aby moje indeksy klastrowe były unikalne. Chciałbym uzyskać drugą opinię na ten temat.
Dzięki!
źródło
Lubię sprawdzić, co na ten temat ma do powiedzenia Kimberly Tripp The Queen of Indexing:
Zacznę od mojej rekomendacji klucza klastrowego - z kilku powodów. Po pierwsze, jest to łatwa decyzja, a po drugie, wczesne podjęcie takiej decyzji pomaga aktywnie zapobiegać niektórym typom fragmentacji. Jeśli możesz zapobiec pewnym typom fragmentacji tabeli bazowej, możesz zminimalizować niektóre czynności konserwacyjne (z których niektóre w SQL Server 2000 ORAZ mniejsze w SQL Server 2005) wymagają, aby tabela była w trybie offline. OK, przejdę do odbudowy później .....
Zacznijmy od kluczowych rzeczy, których szukam w kluczu klastrowym:
Dlaczego wyjątkowy? Klucz klastra powinien być unikalny, ponieważ klucz klastrowania (jeśli taki istnieje) jest używany jako klucz wyszukiwania ze wszystkich indeksów nieklastrowanych. Weźmy na przykład indeks na końcu książki - jeśli chcesz znaleźć dane, na które wskazuje wpis indeksu - ten wpis (wpis indeksu) musi być unikalny, w przeciwnym razie który wpis indeksu byłby tym, którego szukasz ? Więc kiedy tworzysz indeks klastrowy - musi być unikalny. Ale SQL Server nie wymaga, aby klucz klastrowania był tworzony w unikatowej kolumnie. Możesz go utworzyć w dowolnej kolumnie (kolumnach). Wewnętrznie, jeśli klucz klastrowania nie jest unikalny, SQL Server „ujednolici” go, dodając 4-bajtową liczbę całkowitą do danych. Więc jeśli indeks klastrowy jest tworzony na czymś, co nie jest unikalne, to nie tylko występuje dodatkowe obciążenie związane z tworzeniem indeksu, ale także marnowane miejsce na dysku,
Źródło: Coraz większa debata na temat klastrów - znowu!
źródło
newsequentialid()
aby uzyskać prawie sekwencyjny identyfikator GUID. Ale tak: jeżeli ty dodaj swój własny, unikalny identyfikator (I zawsze wolą INT IDENTITY), to trzeba tę wartość pod ręką i można go używać (np ustanowienie relacji FK). Unikatowe elementy dodane przez SQL Server są dla Ciebie niewidoczne, a zatem są tylko narzutem, którego nie możesz wykorzystać.Nie robią i są chwile, kiedy lepiej jest, jeśli nie są.
Rozważ tabelę z pół-losowym, unikalnym identyfikatorem pracownika i identyfikatorem działu dla każdego pracownika: jeśli Twoja instrukcja select jest
SELECT * FROM EmployeeTable WHERE DepartmentId=%DepartmentValue%
wtedy najlepiej pod względem wydajności jest, jeśli
DepartmentId
jest to indeks klastrowy, mimo że (a zwłaszcza dlatego, że) nie jest indeksem unikatowym (najlepiej pod względem wydajności, ponieważ zapewnia, że wszystkie rekordy w ramach danego DepartmentId są zgrupowane).Na przykład istnieją Wytyczne dotyczące projektowania indeksów klastrowych , które mówią:
Rozumiem na przykład, że „wysoki stopień unikalności” jest taki, że wybranie „Kraj” jako indeksu klastrowego nie jest dobre, jeśli większość zapytań chce wybrać rekordy w danym mieście.
źródło