Jakie są różnice między indeksem klastrowanym a nieklastrowanym?

277

Jakie są różnice między a clustereda a non-clustered index?

Eric Labashosky
źródło
8
Możesz mieć tylko jeden indeks klastrowy na tabelę. Ale istnieje wiele innych różnic ...
Tom Robinson
5
Indeks klastrowy faktycznie opisuje kolejność, w jakiej rekordy są fizycznie przechowywane na dysku, stąd też powód, dla którego można go mieć tylko jeden. Indeks nieklastrowany definiuje logiczną kolejność, która nie pasuje do fizycznej kolejności na dysku.
Josh
1
Klaster zasadniczo oznacza, że ​​dane są w tej fizycznej kolejności w tabeli. Dlatego możesz mieć tylko jeden na stół. Bezklastrowy oznacza, że ​​jest to „tylko” logiczny porządek.
Biri
2
@biri czym jest porządek „logiczny”? indeks nieklastrowany przechowuje klucze indeksu fizycznie w kolejności i przechowuje wskaźnik do tabeli, a mianowicie klastrowany klucz indeksu.
Stephanie Page
@Stephanie Page: logiczne z punktu widzenia tabeli. Oczywiście indeksy nieklastrowane są uporządkowane fizycznie w samym indeksie.
Biri

Odpowiedzi:

268

Indeks klastrowy

  • Tylko jeden na stół
  • Szybszy do odczytu niż nieklastrowany, ponieważ dane są fizycznie przechowywane w kolejności indeksu

Indeks nieklastrowany

  • Może być używany wiele razy na stół
  • Szybszy dla operacji wstawiania i aktualizacji niż indeks klastrowany

Oba typy indeksu poprawią wydajność po wybraniu danych z polami korzystającymi z indeksu, ale spowolnią operacje aktualizacji i wstawiania.

Z powodu wolniejszego wstawiania i aktualizacji indeksy klastrowe powinny być ustawione na polu, które zwykle jest przyrostowe, tj. Id lub Datownik.

SQL Server zwykle używa indeksu tylko wtedy, gdy jego selektywność przekracza 95%.

Martynnw
źródło
9
Istnieją również kwestie dotyczące przechowywania. Podczas wstawiania wierszy do tabeli bez indeksu klastrowego wiersze są zapisywane z powrotem na stronie, a aktualizacja wiersza może spowodować przeniesienie wiersza na koniec tabeli, pozostawiając puste miejsce i fragmentację tabeli i indeksów.
Jeremiah Peschka
4
nie musisz się przejmować, co to jest x. Wszystko, co musisz wiedzieć, to to, że dla aplikacji z milionami użytkowników x będzie znaczący
Pacerier
14
To czysto dogmat. Nie jest „szybszy do odczytu, ponieważ dane są przechowywane w kolejności”. Jest szybszy do odczytania, ponieważ unikasz odczytu indeksu, A NASTĘPNIE odczytywana jest tabela. Skanowanie zakresu jest szybsze (jeśli ma to sens), ponieważ dane są przechowywane w kolejności. tzn. współczynnik skupienia jest idealny.
Stephanie Page
6
Pomysł, że 95% rekordów musi być unikalnych, jest błędem. Załóżmy, że masz tabelę z 1 000 000 wierszy i indeksujesz kolumnę z 500 000 kluczami. 0% jest unikalnych, ale każdy klucz zwraca 2 z miliona wierszy. Ten indeks jest absolutnie użyteczny niezależnie od tego, że 0% rekordów jest unikalnych.
Stephanie Page
2
„dane są fizycznie przechowywane w kolejności indeksu”, co przez to rozumiesz? Na jednym poziomie jest to trywialnie prawdziwe, ponieważ strony danych i strony liści indeksu są takie same - więc oczywiście kolejność jednej opisuje kolejność drugiej. Jednak niekoniecznie jest to w jakiejkolwiek określonej kolejności, takiej jak kolejność klucza indeksu stackoverflow.com/questions/1251636/…
Martin Smith
79

Indeksy klastrowe fizycznie porządkują dane na dysku. Oznacza to, że dla indeksu nie są potrzebne żadne dodatkowe dane, ale może istnieć tylko jeden indeks klastrowany (oczywiście). Dostęp do danych za pomocą indeksu klastrowego jest najszybszy.

Wszystkie pozostałe indeksy muszą być nieklastrowane. Indeks nieklastrowany ma duplikat danych z indeksowanych kolumn uporządkowanych razem ze wskaźnikami do rzeczywistych wierszy danych (wskaźniki do indeksu klastrowego, jeśli taki istnieje). Oznacza to, że dostęp do danych przez indeks nieklastrowany musi przejść przez dodatkową warstwę pośrednictwa. Jeśli jednak wybierzesz tylko dane dostępne w indeksowanych kolumnach, możesz odzyskać dane bezpośrednio ze zduplikowanych danych indeksowych (dlatego warto WYBRAĆ tylko te kolumny, których potrzebujesz, a nie używać *)

rslite
źródło
3
„Jeśli jednak wybierzesz tylko dane dostępne w indeksowanych kolumnach, możesz odzyskać dane bezpośrednio ze zduplikowanych danych indeksu” - tak, to ważny wyjątek od preferowanej heurystyki indeksu klastrowego. Wydaje mi się, że w tym przypadku masz indeks klastrowany, ale mniej danych w tabeli, o którą pytasz, więc potencjalnie można go szybciej odczytać z dysku.
satnhak,
34

Indeksy klastrowe są przechowywane fizycznie na stole. Oznacza to, że są one najszybsze i możesz mieć tylko jeden indeks klastrowy na tabelę.

Indeksy nieklastrowane są przechowywane osobno i możesz mieć ich tyle, ile chcesz.

Najlepszą opcją jest ustawienie indeksu klastrowego na najczęściej używanej unikalnej kolumnie, zwykle PK. Zawsze powinieneś mieć dobrze dobrany indeks klastrowy w swoich tabelach, chyba że bardzo ważny powód - nie mogę wymyślić jednego, ale hej, może być na zewnątrz - ponieważ nie robi się tak.

Santiago Cepas
źródło
3
czy możesz bardziej szczegółowo rozwinąć kwestię „zawsze powinniśmy mieć indeks klastrowany w naszych tabelach”? bez rozwinięcia to stwierdzenie jest po prostu błędne, ponieważ słowo to zawsze
Pacerier,
1
Masz rację, Pacerier, nie należy lekceważyć bezwzględnych stwierdzeń. Chociaż nie znam żadnego przypadku, w którym nie powinieneś mieć dobrze wybranego indeksu klastrowego, taki przypadek może istnieć, więc zmieniłem odpowiedź na bardziej ogólną wersję.
Santiago Cepas
28

Indeks klastrowy

  1. Dla tabeli może być tylko jeden indeks klastrowany.
  2. Zwykle wykonane na kluczu podstawowym.
  3. Węzły liści indeksu klastrowego zawierają strony danych.

Indeks nieklastrowany

  1. Tabela może zawierać tylko 249 indeksów nieklastrowych (do wersji SQL 2005 późniejsze wersje obsługują do 999 indeksów nieklastrowych).
  2. Zwykle wykonane na dowolnym klawiszu.
  3. Węzeł liścia indeksu nieklastrowanego nie składa się ze stron danych. Zamiast tego węzły liści zawierają wiersze indeksu.
Jojo
źródło
24

Indeks klastrowy

  • W tabeli może znajdować się tylko jeden indeks klastrowany
  • Sortuj rekordy i przechowuj je fizycznie zgodnie z zamówieniem
  • Pobieranie danych jest szybsze niż indeksy nieklastrowane
  • Nie potrzebujesz dodatkowej przestrzeni do przechowywania logicznej struktury

Indeks nieklastrowany

  • W tabeli może znajdować się dowolna liczba indeksów nieklastrowanych
  • Nie wpływaj na porządek fizyczny. Utwórz logiczną kolejność wierszy danych i użyj wskaźników do fizycznych plików danych
  • Wstawianie / aktualizacja danych jest szybsze niż indeks klastrowany
  • Użyj dodatkowej przestrzeni do przechowywania logicznej struktury

Oprócz tych różnic musisz wiedzieć, że gdy tabela nie jest klastrowana (gdy tabela nie ma indeksu klastrowego), pliki danych są nieuporządkowane i używa struktury danych Sterty jako struktury danych.

Lasitha Yapa
źródło
10

Klaster zasadniczo oznacza, że ​​dane są w tej fizycznej kolejności w tabeli. Dlatego możesz mieć tylko jeden na stół.

Bezklastrowy oznacza, że ​​jest to „tylko” logiczny porządek.

Biri
źródło
9

Plusy:

Indeksy klastrowe działają doskonale dla zakresów (np. Wybierz * z mojej_tabeli gdzie mój_klucz między @min a @max)

W niektórych warunkach DBMS nie będzie musiał wykonywać sortowania, jeśli użyjesz instrukcji orderby.

Cons:

Indeksy klastrowe mogą spowalniać wstawianie, ponieważ fizyczne układy rekordów muszą zostać zmodyfikowane, ponieważ rekordy są wstawiane, jeśli nowe klucze nie są w kolejności sekwencyjnej.

Giovanni Galbo
źródło
6

Indeks klastrowy jest zasadniczo posortowaną kopią danych w indeksowanych kolumnach.

Główną zaletą indeksu klastrowego jest to, że gdy zapytanie (szukanie) lokalizuje dane w indeksie, to nie jest potrzebne dodatkowe IO do odzyskania tych danych.

Narzut związany z utrzymywaniem indeksu klastrowego, szczególnie w często aktualizowanej tabeli, może prowadzić do niskiej wydajności iz tego powodu może być wskazane utworzenie indeksu nieklastrowego.

Ed Guiness
źródło
6

Indeksowana baza danych składa się z dwóch części: zestawu rekordów fizycznych ułożonych w dowolnej kolejności oraz zestawu indeksów identyfikujących sekwencję, w której rekordy powinny być odczytywane, aby uzyskać wynik posortowany według pewnego kryterium. Jeśli nie ma korelacji między fizycznym ustawieniem a indeksem, wówczas odczyt wszystkich rekordów w kolejności może wymagać wykonania wielu niezależnych operacji odczytu pojedynczych rekordów. Ponieważ baza danych może być w stanie odczytać dziesiątki kolejnych rekordów w krótszym czasie, niż zajęłoby to odczytanie dwóch niesekwencyjnych rekordów, wydajność można poprawić, jeśli rekordy, które są kolejne w indeksie, są również przechowywane na dysku.

Na przykład, gdyby rozpocząć od pustej nieklastrowanej bazy danych i dodać 10 000 rekordów w losowej kolejności, rekordy prawdopodobnie zostaną dodane na końcu w kolejności, w jakiej zostały dodane. Odczyt bazy danych w kolejności według indeksu wymagałby 10 000 odczytów jednego rekordu. Gdyby jednak użyć klastrowanej bazy danych, system może sprawdzić podczas dodawania każdego rekordu, czy poprzedni rekord był przechowywany sam; jeśli okaże się, że tak jest, może zapisać ten rekord z nowym rekordem na końcu bazy danych. Następnie mógł spojrzeć na fizyczny rekord przed szczelinami, w których znajdowały się przeniesione rekordy, i sprawdzić, czy rekord, który nastąpił po nim, był przechowywany sam. Jeśli okaże się, że tak jest, może przenieść ten rekord w to miejsce. Takie podejście spowodowałoby zgrupowanie wielu rekordów w pary,

W rzeczywistości w klastrowych bazach danych stosuje się bardziej wyrafinowane algorytmy. Należy jednak zauważyć, że istnieje kompromis między czasem potrzebnym do zaktualizowania bazy danych a czasem potrzebnym do jej sekwencyjnego odczytu. Utrzymanie klastrowanej bazy danych znacznie zwiększy ilość pracy wymaganej do dodawania, usuwania lub aktualizacji rekordów w jakikolwiek sposób, który wpływałby na kolejność sortowania. Jeśli baza danych będzie odczytywana sekwencyjnie znacznie częściej niż będzie aktualizowana, grupowanie może być dużą wygraną. Jeśli będzie często aktualizowany, ale rzadko odczytywany po kolei, klastrowanie może być dużym spadkiem wydajności, szczególnie jeśli kolejność dodawania elementów do bazy danych jest niezależna od ich kolejności sortowania w odniesieniu do indeksu klastrowanego.

supercat
źródło
5

Indeks klastrowy faktycznie opisuje kolejność, w jakiej rekordy są fizycznie przechowywane na dysku, stąd też powód, dla którego można go mieć tylko jeden.

Indeks nieklastrowany definiuje logiczną kolejność, która nie pasuje do fizycznej kolejności na dysku.

Josh
źródło
2

Być może przejrzałeś część teoretyczną z powyższych postów:

- Indeks klastrowy, ponieważ widzimy bezpośrednio punkty do zapisania, tj. Jego bezpośrednie, więc wyszukiwanie zajmuje mniej czasu. Dodatkowo nie zajmie dodatkowej pamięci / miejsca do przechowywania indeksu

- Podczas gdy w Indeksie nieklastrowanym pośrednio wskazuje Indeks klastrowany, wówczas uzyskuje dostęp do faktycznego rekordu, ze względu na swój pośredni charakter dostęp do niego zajmie trochę więcej czasu, a także potrzebuje własnej pamięci / przestrzeni do przechowywania indeks

wprowadź opis zdjęcia tutaj

Nandkishor Nangre
źródło
0

// Skopiowano z MSDN, drugi punkt indeksu nieklastrowanego nie jest wyraźnie wymieniony w innych odpowiedziach.

Zgrupowane

  • 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 istnieć tylko jeden indeks klastrowany na tabelę, ponieważ same wiersze danych mogą być przechowywane tylko w jednej kolejności.
  • Wiersze danych w tabeli są przechowywane w sortowanej kolejności tylko wtedy, gdy tabela zawiera indeks klastrowany. Gdy tabela ma indeks klastrowany, jest ona nazywana tabelą klastrową. Jeśli tabela nie ma indeksu klastrowego, wiersze danych są przechowywane w nieuporządkowanej strukturze zwanej stertą.

Niesklastrowany

  • Indeksy nieklastrowane mają strukturę oddzielną od wierszy danych. Indeks nieklastrowany zawiera wartości klucza indeksu nieklastrowanego, a
    każda pozycja wartości klucza ma wskaźnik do wiersza danych zawierającego wartość klucza.
  • Wskaźnik z wiersza indeksu w indeksie nieklastrowanym do wiersza danych nazywa się lokalizatorem wiersza. Struktura lokalizatora wierszy zależy od tego, czy strony danych są przechowywane w stercie czy w tabeli klastrowej. W przypadku sterty lokalizator wierszy jest wskaźnikiem wiersza. W przypadku tabeli klastrowej lokalizatorem wiersza jest klastrowany klucz indeksu.
Deepak Mishra
źródło