Pytanie nie brzmi „kiedy PK powinien być NC”, ale zamiast tego należy zapytać „jaki jest właściwy klucz dla indeksu klastrowego”?
Odpowiedź naprawdę zależy od tego, w jaki sposób przeszukujesz dane . Indeks klastrowy ma przewagę nad wszystkimi innymi indeksami: ponieważ zawsze zawiera wszystkie kolumny, zawsze obejmuje. Dlatego zapytania, które mogą wykorzystać indeks klastrowany, z pewnością nie muszą wykorzystywać odnośników do spełnienia niektórych rzutowanych kolumn i / lub predykatów.
Kolejnym elementem układanki jest sposób użycia indeksu ? Istnieją trzy typowe wzory:
- sondy, gdy w indeksie szukana jest pojedyncza wartość klucza
- skanowanie zakresów, gdy pobierany jest zakres wartości kluczowych
- sortuj według wymagań, gdy indeks może spełnić zamówienie, nie wymagając sortowania stop-and-go
Jeśli więc przeanalizujesz oczekiwane obciążenie (zapytania) i odkryjesz, że duża liczba zapytań użyłaby określonego indeksu, ponieważ używają określonego wzorca dostępu, który korzysta z indeksu, warto zaproponować ten indeks jako indeks klastrowany.
Jeszcze innym czynnikiem jest to, że klastrowany klucz indeksu jest kluczem wyszukiwania używanym przez wszystkie nieklastrowane indeksy, a zatem szeroki klastrowany klucz indeksu tworzy efekt falowania i poszerza wszystkie nieklastrowane indeksy, a szerokie indeksy oznaczają więcej stron, więcej operacji we / wy , więcej pamięci, mniej dobroci.
Dobry indeks klastrowany jest stabilny , nie zmienia się w czasie istnienia encji, ponieważ zmiana wartości klucza indeksu klastrowego oznacza, że wiersz musi zostać usunięty i wstawiony z powrotem.
Dobry klastrowany indeks rośnie w kolejności nie losowej (każda nowo wstawiona wartość klucza jest większa niż poprzednia wartość), aby uniknąć podziału strony i fragmentacji (bez bałagania się przy pomocy FILLFACTOR
s).
Skoro już wiemy, co to jest dobry klastrowany klucz indeksu, czy klucz podstawowy (który jest logiczną właściwością modelowania danych) spełnia wymagania? Jeśli tak, to PK powinno być zgrupowane. Jeśli nie, PK powinien być nieklastrowany.
Aby podać przykład, rozważ tabelę faktów sprzedażowych. Każdy wpis ma identyfikator, który jest kluczem podstawowym. Jednak zdecydowana większość zapytań wymaga danych między datą a inną datą, dlatego najlepszym klastrowanym kluczem indeksu byłaby data sprzedaży , a nie identyfikator . Innym przykładem posiadania innego indeksu klastrowego niż klucz podstawowy jest bardzo niski klucz selektywności, taki jak „kategoria” lub „stan”, klucz o bardzo niewielu odrębnych wartościach. Posiadanie klastrowanego klucza indeksu z tym kluczem niskiej selektywności jako kluczem najbardziej na lewo, np. (state, id)
, Często ma sens ze względu na skany zakresów, które szukają wszystkich wpisów w określonym „stanie”.
Ostatnia uwaga na temat możliwości nieklastrowego klucza podstawowego nad stertą (tj. W ogóle nie ma indeksu klastrowanego). Może to być prawidłowy scenariusz, typowym powodem jest krytyczna wydajność wkładki luzem, ponieważ hałdy mają znacznie lepszą przepustowość wkładki luzem w porównaniu z indeksami klastrowymi.