Jakie są różnice między a clustered
a a non-clustered index
?
sql-server
indexing
clustered-index
non-clustered-index
Eric Labashosky
źródło
źródło
Odpowiedzi:
Indeks klastrowy
Indeks nieklastrowany
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%.
źródło
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ć *)
źródło
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.
źródło
Indeks klastrowy
Indeks nieklastrowany
źródło
Indeks klastrowy
Indeks nieklastrowany
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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
źródło
// Skopiowano z MSDN, drugi punkt indeksu nieklastrowanego nie jest wyraźnie wymieniony w innych odpowiedziach.
Zgrupowane
Niesklastrowany
każda pozycja wartości klucza ma wskaźnik do wiersza danych zawierającego wartość klucza.
źródło