Mam ograniczoną ekspozycję na DB i używałem DB jako programisty aplikacji. Chcę wiedzieć o Clustered
i Non clustered indexes
. Poszukałem google i znalazłem:
Indeks klastrowy to specjalny typ indeksu, który zmienia porządek fizycznego przechowywania rekordów w tabeli. Dlatego tabela może mieć tylko jeden indeks klastrowany. Węzły liści indeksu klastrowego zawierają strony danych. Indeks nieklastrowany to specjalny typ indeksu, w którym logiczna kolejność indeksu nie jest zgodna z fizyczną kolejnością przechowywanych wierszy na dysku. Węzeł liścia indeksu nieklastrowanego nie składa się ze stron danych. Zamiast tego węzły liści zawierają wiersze indeksu.
To, co znalazłem w SO było Jakie są różnice między indeksem klastrowanym a nieklastrowanym? .
Czy ktoś może to wytłumaczyć zwykłym angielskim?
Indeks klastrowy oznacza, że mówisz do bazy danych, aby zapisywała na dysku wartości bliskie sobie. Ma to tę zaletę, że szybkie skanowanie / pobieranie rekordów należących do pewnego zakresu wartości indeksu klastrowego.
Na przykład masz dwie tabele, Klient i Zamówienie:
Jeśli chcesz szybko odzyskać wszystkie zamówienia jednego konkretnego klienta, możesz utworzyć indeks klastrowy w kolumnie „CustomerID” w tabeli zamówień. W ten sposób rekordy o tym samym identyfikatorze klienta będą fizycznie przechowywane blisko siebie na dysku (w klastrze), co przyspieszy ich wyszukiwanie.
PS Indeks na CustomerID oczywiście nie będzie unikalny, więc albo musisz dodać drugie pole, aby „ujednolicić” indeks, albo pozwolić, aby baza danych sobie z tym poradziła, ale to inna historia.
Odnośnie wielu indeksów. Możesz mieć tylko jeden indeks klastrowy na tabelę, ponieważ określa to sposób fizycznego uporządkowania danych. Jeśli chcesz analogii, wyobraź sobie duży pokój z wieloma stolikami. Możesz albo ułożyć te stoły, aby utworzyć kilka rzędów, albo zebrać je wszystkie razem, aby utworzyć duży stół konferencyjny, ale nie w obie strony jednocześnie. Tabela może mieć inne indeksy, następnie wskażą wpisy w indeksie klastrowym, który z kolei ostatecznie powie, gdzie znaleźć rzeczywiste dane.
źródło
XML
,VARCHAR(MAX)
alboVARBINARY(MAX)
. Zauważ, że zwykle sensowne jest najpierw klastrowanie w polu daty , ponieważ indeks klastrowy jest najbardziej wydajny w przypadku skanowania zakresu, które jest najczęściej w przypadku typów dat. YMMV.W SQL Server magazyn zorientowany na wiersze zarówno indeksy klastrowe, jak i nieklastrowane są zorganizowane jako drzewa B.
( Źródło obrazu )
Kluczową różnicą między indeksami klastrowymi a indeksami nieklastrowanymi jest to, że poziom liścia indeksu klastrowanego to tabela. Ma to dwie konsekwencje.
Indeksy nieklastrowane mogą również wykonać punkt 1, używając
INCLUDE
klauzuli (od SQL Server 2005), aby jawnie dołączyć wszystkie niekluczowe kolumny, ale są to drugorzędne reprezentacje i zawsze istnieje kolejna kopia danych (sama tabela).Dwa powyższe indeksy będą prawie identyczne. Za pomocą stron indeksu wyższego poziomu zawierających wartości dla kluczowych kolumn
A,B
i stron zawierających liśćA,B,C,D
Powyższy cytat z książek SQL Server online powoduje wiele zamieszania
Moim zdaniem byłoby to o wiele lepiej sformułowane jako.
Cytat z książek w Internecie nie jest niepoprawny, ale należy wyjaśnić, że „sortowanie” zarówno wskaźników niesklastrowanych, jak i klastrowanych jest logiczne, a nie fizyczne. Jeśli czytasz strony na poziomie liścia, postępując zgodnie z połączoną listą i czytasz wiersze na stronie w kolejności tablic szczelin, to odczytujesz rzędy indeksu w posortowanej kolejności, ale fizycznie strony nie mogą być sortowane. Powszechnie uważa się, że przy indeksie klastrowym wiersze są zawsze fizycznie przechowywane na dysku w tej samej kolejności, w jakiej klucz indeksu jest fałszywy.
To byłoby absurdalne wdrożenie. Na przykład, jeśli wiersz zostanie wstawiony na środku tabeli 4 GB, SQL Server nie musi kopiować 2 GB danych w pliku, aby zrobić miejsce dla nowo wstawionego wiersza.
Zamiast tego następuje podział strony. Każda strona na poziomie liści zarówno indeksów klastrowych, jak i nieklastrowanych ma adres (
File:Page
) następnej i poprzedniej strony w logicznej kolejności kluczy. Strony te nie muszą być ciągłe ani w kolejności kluczowej.np. może być połączony łańcuch stron
1:2000 <-> 1:157 <-> 1:7053
Kiedy dochodzi do podziału strony, nowa strona jest przydzielana z dowolnego miejsca w grupie plików (z zakresu mieszanego, w przypadku małych tabel lub niepustego zakresu jednolitego należącego do tego obiektu lub nowo przydzielonego zakresu jednolitego). Może to nawet nie znajdować się w tym samym pliku, jeśli grupa plików zawiera więcej niż jeden.
Stopień, w jakim logiczna kolejność i ciągłość różni się od wyidealizowanej wersji fizycznej, to stopień logicznej fragmentacji.
W nowo utworzonej bazie danych z jednym plikiem uruchomiłem następujące.
Następnie sprawdź układ strony za pomocą
Wyniki były wszędzie. Pierwszy rząd w kolejności klawiszy (o wartości 1 - podświetlonej strzałką poniżej) znajdował się na prawie ostatniej stronie fizycznej.
Fragmentację można zmniejszyć lub usunąć poprzez przebudowę lub reorganizację indeksu w celu zwiększenia korelacji między porządkiem logicznym a porządkiem fizycznym.
Po bieganiu
Mam następujące
Jeśli tabela nie ma indeksu klastrowego, nazywana jest stertą.
Indeksy nieklastrowane można budować na stercie lub indeksie klastrowym. Zawsze zawierają lokalizator wierszy z powrotem do tabeli podstawowej. W przypadku sterty jest to fizyczny identyfikator wiersza (rid) i składa się z trzech komponentów (Plik: Strona: Slot). W przypadku indeksu klastrowanego lokalizator wierszy jest logiczny (klastrowany klucz indeksu).
W tym drugim przypadku, jeśli indeks nieklastrowany już naturalnie zawiera kolumny klucza CI jako kolumny klucza NCI lub
INCLUDE
kolumny -d, wówczas nic nie jest dodawane. W przeciwnym razie brakujące kolumny klucza CI zostaną po cichu dodane do NCI.SQL Server zawsze zapewnia, że kolumny kluczy są unikalne dla obu typów indeksu. Mechanizm, w którym jest to wymuszane dla indeksów niezadeklarowanych jako unikalne, różni się jednak między tymi dwoma typami indeksów.
Indeksy klastrowe są
uniquifier
dodawane do wszystkich wierszy z kluczowymi wartościami, które duplikują istniejący wiersz. To tylko rosnąca liczba całkowita.W przypadku indeksów nieklastrowanych niezadeklarowanych jako unikalny SQL Server dyskretnie dodaje lokalizator wierszy do nieklastrowanego klucza indeksu. Dotyczy to wszystkich wierszy, a nie tylko tych, które są faktycznie duplikatami.
Nomenklatura klastrowa vs. nieklastrowana jest również używana do indeksów magazynu kolumn. W artykule Rozszerzenia SQL Server Stores Kolumna stanach
źródło
SQL Server 2014
. Otrzymuję95%
fragmentację indeksu po początkowej wstawce. Poindex rebuild
fragmentacji było0%
i wartości zostały uporządkowane. Zastanawiam się, czy możemy to powiedziećThe only time the data rows in a table are stored in sorted order is when its clustered index fragmentation is 0
?Zdaję sobie sprawę, że to bardzo stare pytanie, ale pomyślałem, że dam analogię, aby pomóc zilustrować powyższe dobre odpowiedzi.
INDEKS KLASTROWANY
Jeśli wejdziesz do biblioteki publicznej, zobaczysz, że wszystkie książki są ułożone w określonej kolejności (najprawdopodobniej system dziesiętny Deweya lub DDS). Odpowiada to „indeksowi klastrowemu” książek. Jeśli numer DDS dla wybranej książki
005.7565 F736s
byłby, zacznij od zlokalizowania rzędu półek z książkami, który jest oznaczony,001-099
lub czegoś podobnego. (Ten znak zaślepki na końcu stosu odpowiada „węzłowi pośredniczemu” w indeksie.) W końcu możesz przejść do konkretnej półki oznaczonej etykietą005.7450 - 005.7600
, a następnie skanować, aż znajdziesz książkę o podanym numerze DDS # i od tego momentu znalazłeś swoją książkę.INDEKS NIEKOPEROWANY
Ale jeśli nie wszedłeś do biblioteki z zapamiętanym numerem DDS swojej książki, potrzebujesz drugiego indeksu, aby ci pomóc. W dawnych czasach przed biblioteką znajdowało się wspaniałe biuro szuflad znane jako „Katalog kart”. Było w niej tysiące kart 3x5 - po jednej na każdą książkę, posortowanych w kolejności alfabetycznej (być może według tytułu). Odpowiada to „indeksowi nieklastrowanemu” . Te katalogi kart zostały zorganizowane w hierarchiczną strukturę, dzięki czemu każda szuflada będzie oznaczona zakresem zawartych w niej kart (
Ka - Kl
np. „Węzeł pośredni”). Jeszcze raz będziesz wiercił się, dopóki nie znajdziesz swojej książki, ale w tym przypadku, gdy ją znajdziesz (tj. „Węzeł liścia”), nie masz samej książki,numer indeksu (numer DDS), za pomocą którego można znaleźć rzeczywistą książkę w indeksie klastrowym.Oczywiście nic nie powstrzymałoby bibliotekarza przed kopiowaniem wszystkich kart i sortowaniem ich w innej kolejności w osobnym katalogu kart. (Zazwyczaj istnieją co najmniej dwa takie katalogi: jeden posortowany według nazwiska autora, a drugi według tytułu.) Zasadniczo możesz mieć tyle indeksów „nieklastrowanych”, ile chcesz.
źródło
Znajdź poniżej niektóre cechy indeksów klastrowanych i nieklastrowanych:
Indeksy klastrowe
create Index index_name(col1, col2, col.....)
.Indeksy nieklastrowane
źródło
Bardzo prostą, nietechniczną ogólną zasadą byłoby, że indeksy klastrowe są zwykle używane dla klucza podstawowego (lub przynajmniej unikalnej kolumny), a nieklastrowane są używane w innych sytuacjach (być może klucz obcy) . Rzeczywiście, SQL Server domyślnie utworzy indeks klastrowany w kolumnach klucza podstawowego. Jak się dowiesz, indeks klastrowy odnosi się do sposobu fizycznego sortowania danych na dysku, co oznacza, że jest dobrym wyborem dla większości sytuacji.
źródło
Indeks klastrowy
Indeks klastrowy określa fizyczną kolejność danych w tabeli. Z tego powodu tabela ma tylko 1 indeks klastrowany.
„ słownik ” Nie potrzeba żadnego innego indeksu, to już indeks według słów
Indeks nieklastrowany
Indeks nieklastrowany jest analogiczny do indeksu w książce. Dane są przechowywane w jednym miejscu. Indeks jest przechowywany w innym miejscu, a indeks ma wskaźniki do miejsca przechowywania danych. Z tego powodu tabela ma więcej niż 1 indeks nieklastrowany.
źródło
Indeks klastrowy
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 można sortować 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.
Możesz dodać kolumny niekluczowe do poziomu liścia indeksu nieklastrowanego, aby ominąć istniejące limity kluczy indeksu i wykonać pełne, indeksowane zapytania. Aby uzyskać więcej informacji, zobacz Tworzenie indeksów z dołączonymi kolumnami. Aby uzyskać szczegółowe informacje na temat limitów klucza indeksu, zobacz Specyfikacje maksymalnej pojemności dla SQL Server.
Odniesienie: https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-description
źródło
Pozwólcie, że podam definicję podręcznika dotyczącą „indeksu klastrowania”, zaczerpniętą z 15.6.1 z Database Systems: The Complete Book :
Aby zrozumieć definicję, spójrzmy na przykład 15.10 dostarczony przez podręcznik:
Należy pamiętać, że definicja nie wymusza bloków danych, które muszą być ciągłe na dysku; mówi tylko, że krotki z kluczem wyszukiwania są spakowane w jak najmniejszej liczbie bloków danych.
Powiązaną koncepcją jest relacja klastrowa . Relacja jest „skupiona”, jeśli jej krotki są zapakowane w mniej więcej tyle bloków, ile jest w stanie pomieścić te krotki. Innymi słowy, z perspektywy bloku dysku, jeśli zawiera krotki z różnych relacji, relacji tych nie można grupować (tzn. Istnieje bardziej spakowany sposób przechowywania takiej relacji poprzez zamianę krotek tej relacji z innych bloków dysku z krotki nie należą do relacji w bieżącym bloku dysku). Oczywiście
R(a,b)
w powyższym przykładzie jest skupiony.Aby połączyć ze sobą dwie koncepcje, relacja klastrowa może mieć indeks klastrowy i indeks nieklastrowy. Jednak w przypadku relacji nieklastrowanej indeks klastrowania nie jest możliwy, chyba że indeks jest zbudowany na kluczu podstawowym relacji.
„Klaster” jako słowo jest spamowany na wszystkich poziomach abstrakcji po stronie pamięci bazy danych (trzy poziomy abstrakcji: krotki, bloki, pliki). Koncepcja zwana „ plikiem klastrowym ”, który opisuje, czy plik (abstrakcja dla grupy bloków (jeden lub więcej bloków dysku)) zawiera krotki z jednej relacji lub różnych relacji. Nie dotyczy koncepcji indeksu klastrowego, ponieważ znajduje się na poziomie pliku.
Jednak niektóre materiały dydaktyczne lubią definiować indeks klastrowania na podstawie definicji pliku klastrowego. Te dwa typy definicji są takie same na poziomie relacji klastrowej, bez względu na to, czy definiują relację klastrową pod względem bloku dysku danych lub pliku. Z linku w tym akapicie
Przechowywanie krotek po kolei jest takie samo, jak powiedzenie „krotki są spakowane w mniej więcej tyle bloków, ile jest w stanie pomieścić krotki” (z niewielką różnicą w przypadku jednego pliku, a drugiego dysku). Jest tak, ponieważ przechowywanie krotek po kolei jest sposobem na osiągnięcie „zapakowane w mniej więcej tyle bloków, ile może pomieścić te krotki”.
źródło
Indeks klastrowany: Ograniczenie klucza podstawowego tworzy indeks klastrowany automatycznie, jeśli w tabeli nie istnieje już indeks klastrowany. Rzeczywiste dane indeksu klastrowego można przechowywać na poziomie liścia indeksu.
Indeks nieklastrowany : Rzeczywiste dane indeksu nieklastrowanego nie znajdują się bezpośrednio w węźle liścia, zamiast tego należy wykonać dodatkowy krok, aby je znaleźć, ponieważ ma tylko wartości lokalizatorów wierszy wskazujących na dane rzeczywiste. Indeks nieklastrowany nie może być sortowany jako indeks klastrowany. Może istnieć wiele indeksów nieklastrowanych na tabelę, w rzeczywistości zależy to od używanej wersji serwera SQL. Zasadniczo Sql server 2005 pozwala na 249 indeksów nieklastrowanych, a dla powyższych wersji takich jak 2008, 2016 pozwala na 999 indeksów nieklastrowanych na tabelę.
źródło
Indeks klastrowy - Indeks klastrowy określa kolejność, w której dane są fizycznie przechowywane w tabeli. Dane tabeli można sortować tylko w jeden sposób, dlatego na tabelę może przypadać tylko jeden indeks klastrowany. W SQL Server ograniczenie klucza podstawowego automatycznie tworzy indeks klastrowy w tej konkretnej kolumnie.
Indeks nieklastrowany- Indeks nieklastrowany nie sortuje danych fizycznych w tabeli. W rzeczywistości indeks nieklastrowany jest przechowywany w jednym miejscu, a dane tabeli są przechowywane w innym miejscu. Jest to podobne do podręcznika, w którym zawartość książki znajduje się w jednym miejscu, a indeks w innym. Pozwala to na więcej niż jeden indeks nieklastrowany na tabelę. Należy tutaj wspomnieć, że wewnątrz tabeli dane zostaną posortowane według indeksu klastrowego. Jednak wewnątrz nieklastrowanego indeksu dane są przechowywane w określonej kolejności. Indeks zawiera wartości kolumn, na których indeks jest tworzony, oraz adres rekordu, do którego należy wartość kolumny. Gdy zapytanie zostanie wydane dla kolumny, na której indeks jest tworzony, baza danych najpierw przejdzie do indeksu i wyszuka adres odpowiedniego wiersza w tabeli. Następnie przejdzie do tego adresu wiersza i pobierze inne wartości kolumn. Z powodu tego dodatkowego kroku indeksy nieklastrowane są wolniejsze niż indeksy klastrowe
Różnice między indeksem klastrowanym i nieklastrowanym
Aby uzyskać więcej informacji, zapoznaj się z tym artykułem.
źródło