W rzeczywistości nie trzeba tworzyć indeksu klastrowanego ani klucza podstawowego, ponieważ indeksy unikatowe i indeksy nieunikalne mogą obsłużyć pracę. SQL Server obsługuje Indeks klastrowy od co najmniej wersji 1.1, ale klucz podstawowy był tylko „koncepcją”, którą programiści wymuszali, definiując unikalny indeks.
Wydaje się jednak, że zarówno klucze podstawowe, jak i indeksy klastrowe są wartościowymi pojęciami w większości baz danych.
Spójrzmy na dokumentację SQL Server, aby zobaczyć częściowe opisy niektórych opcji indeksowania, jak pokazano poniżej.
Indeks klastrowy: https://msdn.microsoft.com/en-us/library/ms190457.aspx
- Indeksy klastrowe sortują i przechowują wiersze danych w tabeli lub widoku na podstawie ich kluczowych wartości. Są to kolumny zawarte w definicji indeksu.
- Może być tylko jeden indeks klastrowany na tabelę
Klucz podstawowy: https://msdn.microsoft.com/en-us/library/ms190457.aspx
Tabela może zawierać tylko jedno ograniczenie KLUCZ PODSTAWOWY.
Wszystkie kolumny zdefiniowane w ramach ograniczenia klucza podstawowego muszą być zdefiniowane jako NOT NULL.
Klucz podstawowy można utworzyć jako indeks klastrowany (domyślny, jeśli nie ma indeksu klastrowanego) lub indeks nieklastrowany.
Unikalny indeks: https://msdn.microsoft.com/en-us/library/ms187019.aspx
Podczas tworzenia ograniczenia UNIQUE tworzony jest unikalny indeks nieklastrowany, aby domyślnie wymuszać ograniczenie UNIQUE.
Możesz określić UNIQUE indeks klastrowany, jeśli indeks klastrowany nie istnieje jeszcze dla tabeli.
Oznacza to, że twoje pytanie dotyczące indeksów klastrowych i kluczy podstawowych dotyczy w rzeczywistości niektórych z następujących problemów. Pamiętaj, że nie każda tabela korzysta z tego samego planu indeksowania.
Kiedy skorzystam z oddzielenia klucza podstawowego od indeksu klastrowego?
Być może, gdy indeks klastrowy jest szeroki (na przykład 5 kolumn informacji tekstowych, ale klucz podstawowy jest mały (INT lub BIGINT), jak się wydaje.
- Szeroki indeks klastrowy umożliwia szybkie wybranie wierszy z indeksu dla podzbioru zapytań, które zapewniają szeregowe odpowiedzi z indeksu klastrowanego (zwanego również tabelą ). Na przykład 5-kolumnowy indeks klastrowy obsługuje skanowanie kolumn C1, C2, C3, C4, C5 lub C1, C2, C3, C4 i tak dalej aż do C1.
- Uwaga: Jeśli wiersze były duże, może to dać pewne korzyści szybkościowe przy wyborze szeregowego zestawu wierszy, zwłaszcza jeśli inne kolumny w tabeli są regularnie uwzględniane w zestawie wyników.
- W takim przypadku można użyć klucza głównego dla integralności referencyjnej, aby podać potrzebną wartość jako klucz obcy, aby ograniczyć wiersze w innych tabelach. PK jest mały, a zatem FK jest małym trafieniem w rozmiar tabeli (tabel), do której istnieją odniesienia.
- Należy jednak pamiętać, że każdy indeks utworzony w tabeli z indeksem klastrowanym będzie zawierać wszystkie kolumny klastrów w innych indeksach tworzonych w tej tabeli. Szeroki indeks klastrowany powiększyłby rozmiar wszystkich indeksów nieklastrowanych w tej tabeli.
Czy sam klucz podstawowy powinien być indeks klastrowany?
Jeśli masz mały klucz podstawowy (INT lub BIGINT) i jest to Indeks klastrowany, narzut związany z kolumnami klastra jest stosunkowo niewielki. Chociaż klastrowany klucz podstawowy w tym przypadku będzie również istniał w każdym indeksie w tej tabeli, jest to cena niższa niż w przypadku omawianego powyżej klastra szerokiego.
Ten indeks klastrowany klucza podstawowego zwykle nie zapewnia bezpośrednio łatwej ścieżki do seryjnego wybierania wielu wierszy.
Teraz, gdy utworzyłeś klastrowany klucz podstawowy, co z tymi innymi kolumnami, które kiedyś planowałeś włączyć do indeksu klastrowanego ?
Utwórz indeks Unique (lub Non-Unique) zgodnie z potrzebą, aby zindeksować szerokie kryteria wyszukiwania w kolumnach C1, C2, C3, C4, C5. Wartości w tym indeksie „imitacji klastrowej” mogą służyć jako szybsza ścieżka wyszukiwania dla tych 5 kolumn. Jeśli istnieje nieindeksowana kolumna lub dwie, które są również regularnie wybierane, można je uwzględnić w indeksie za pomocą INCLUDE (Doctor_Name, Diagnosis_Synopsis)
.
Chociaż uważam, że proste Indeksy klastrowe i klucze podstawowe są użyteczne, istnieje kilka dobrych powodów, aby zastanowić się, czy użyć ich w tabeli, czy w bazie danych.
Czy w ogóle potrzebujesz indeksu klastrowanego?
Jeśli utworzysz indeksy (indeksy unikalne i indeksy nieunikalne) i zdefiniujesz klucz podstawowy bez narzutu bycia indeksem klastrowanym, może się okazać, że węższe indeksy zapewnią ci to, czego potrzebujesz do swoich zapytań.
Istnieje kilka przydatnych zachowań w indeksach klastrowych i kluczach podstawowych, ale pamiętaj, że tak naprawdę indeksy są najważniejsze. Zaprojektuj strategię indeksowania, aby uwzględnić realia Twojej aplikacji. Być może OneBigTable
potrzeba innej strategii indeksowania niż w przypadku większości tabel.
Bez indeksu klastrowego dane będą przechowywane jako kupa z identyfikatorem wiersza (RID), który wcale nie jest dobrym mechanizmem wyszukiwania. Ale, jak wspomniano wcześniej, możesz tworzyć unikalne i nieunikalne indeksy do obsługi swoich zapytań.
Co teraz zabiera Cię do rozważenia Sterty:
Sterty i indeksy: https://msdn.microsoft.com/en-us/library/hh213609.aspx
- Gdy tabela jest przechowywana jako kupa, poszczególne wiersze są identyfikowane przez odniesienie do identyfikatora wiersza (RID) składającego się z numeru pliku, numeru strony danych i miejsca na stronie. Identyfikator wiersza jest małą i wydajną strukturą. (Ale to nie jest indeks .)
- Czasami architekci danych używają stosów, gdy dane są zawsze dostępne za pośrednictwem indeksów nieklastrowanych, a RID jest mniejszy niż klastrowany klucz indeksu .
Ale jeśli masz również kilka „gorących punktów” w dużym zbiorze danych, możesz także spojrzeć na inny typ indeksu:
Filtrowany indeks: https://msdn.microsoft.com/en-us/library/cc280372.aspx
Dobrze zaprojektowany filtrowany indeks poprawia wydajność zapytań i jakość planu wykonania, ponieważ jest mniejszy niż indeks nieklastrowany pełnej tabeli i ma przefiltrowane statystyki. Filtrowane statystyki są dokładniejsze niż statystyki z pełną tabelą, ponieważ obejmują tylko wiersze w przefiltrowanym indeksie .
Filtrowane indeksy mają wiele ograniczeń, które są przedstawione w linku do indeksowanych filtrów.
Jeśli jednak zastanawiasz się nad możliwością pominięcia kluczy podstawowych i indeksów klastrowych, możesz przeczytać post Markusa Winanda, do którego link znajduje się poniżej. Przedstawia swoje powody, z niektórymi przykładami kodu, sugerując, że czasem dobrym pomysłem może być rezygnacja z korzystania z tych funkcji.
http://use-the-index-luke.com/blog/2014-01/unreasonable-defaults-primary-key-clustering-key
Ale wszystko w końcu wraca do zrozumienia twojej aplikacji i zaprojektowania kodu, tabel, indeksów itp., Aby pasowały do wykonywanej pracy.