Co tak naprawdę oznacza indeks klastrowany i nieklastrowany?

1117

Mam ograniczoną ekspozycję na DB i używałem DB jako programisty aplikacji. Chcę wiedzieć o Clusteredi 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?

PK
źródło

Odpowiedzi:

1115

W indeksie klastrowym wiersze są fizycznie przechowywane na dysku w tej samej kolejności co indeks. Dlatego może istnieć tylko jeden indeks klastrowany.

Z indeksem nieklastrowanym istnieje druga lista, która zawiera wskaźniki do fizycznych wierszy. Możesz mieć wiele nieklastrowanych indeksów, chociaż każdy nowy indeks wydłuży czas potrzebny do napisania nowych rekordów.

Zazwyczaj szybszy jest odczyt z indeksu klastrowego, jeśli chcesz odzyskać wszystkie kolumny. Nie musisz najpierw iść do indeksu, a potem do tabeli.

Zapis do tabeli z indeksem klastrowym może być wolniejszy, jeśli zajdzie potrzeba zmiany kolejności danych.

Shiraz Bhaiji
źródło
43
Powinieneś wyjaśnić, co rozumiesz przez „fizycznie”.
Spencer Ruport,
141
fizycznie jak w rzeczywistych bitach przechowywanych na dysku
Peter
17
Zobacz msdn „Kiedy tworzysz ograniczenie KLUCZ PODSTAWOWY, unikalny indeks klastrowy w kolumnie lub kolumnach jest tworzony automatycznie, jeśli indeks klastrowany w tabeli już nie istnieje”, co oznacza, że ​​nie musi być tej samej kolumny.
Ming,
46
@Pete, że tak nie jest. SQL Server z pewnością nie gwarantuje, że wszystkie pliki danych są ułożone w ciągłym fizycznym obszarze dysku i że fragmentacja systemu plików jest zerowa. Nie jest nawet prawdą, że indeks klastrowany jest uporządkowany w pliku danych. Stopień, w jakim tak nie jest, to stopień logicznej fragmentacji.
Martin Smith
42
Krótki komentarz do kopii zapasowej punktu Martina Smitha - indeksy klastrowe nie gwarantują sekwencyjnego przechowywania na dysku. Zarządzanie dokładnie tym, gdzie dane są umieszczane na dysku, jest zadaniem systemu operacyjnego, a nie DBMS. Sugeruje to jednak, że przedmioty są uporządkowane ogólnie według klucza klastrowania. Oznacza to na przykład, że jeśli DB wzrośnie o 10 GB, na przykład system operacyjny może zdecydować o umieszczeniu tego 10 GB w porcjach 5 x 2 GB na różnych częściach dysku. Tabela klastrowa obejmująca 10 GB będzie przechowywana sekwencyjnie na każdym fragmencie 2 GB, jednak te fragmenty 2 GB NIE MOGĄ być sekwencyjne.
blobbles
601

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:

Customer
----------
ID
Name
Address

Order
----------
ID
CustomerID
Price

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.

csano
źródło
4
Biorąc to pod uwagę, CI należy zawsze stosować dla PK
mko
4
Czy w przypadku indeksu klastrowego są to rekordy w indeksie lub w tabeli przechowywane blisko siebie?
Caltor,
5
@Caltor Tabela. Indeks jest uporządkowany z definicji. Na przykład, btree zostałoby zamówione, aby można było po prostu wykonać arytmetykę adresów w celu wyszukiwania. Ideą klastra jest dostosowanie tabeli do wydajności określonego indeksu. Aby wyjaśnić, rekordy tabeli zostaną ponownie uporządkowane w celu dopasowania do kolejności , w jakiej indeks był pierwotnie zapisany .
FLGMwt,
9
@Caltor Wcale nie! Rzeczywiście dokumentacja i sama nazwa są dość mylące. Posiadanie „indeksu klastrowego” naprawdę ma niewiele wspólnego z indeksem. Pod względem koncepcyjnym to, co naprawdę masz, to „tabela skupiona na indeksie x ”.
FLGMwt,
3
@ JohnOrtizOrdoñez: Jasne, można użyć niemal każdy to przechowywane w wierszu, więc nie ma XML, VARCHAR(MAX)albo VARBINARY(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.
317

W SQL Server magazyn zorientowany na wiersze zarówno indeksy klastrowe, jak i nieklastrowane są zorganizowane jako drzewa B.

wprowadź opis zdjęcia tutaj

( Ź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.

  1. Wiersze na stronach liścia indeksu klastrowanego zawsze zawierają coś dla każdej (nierzadkiej) kolumny w tabeli (albo wartość, albo wskaźnik do wartości rzeczywistej).
  2. Indeks klastrowy jest podstawową kopią tabeli.

Indeksy nieklastrowane mogą również wykonać punkt 1, używając INCLUDEklauzuli (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).

CREATE TABLE T
(
A INT,
B INT,
C INT,
D INT
)

CREATE UNIQUE CLUSTERED INDEX ci ON T(A,B)
CREATE UNIQUE NONCLUSTERED INDEX nci ON T(A,B) INCLUDE (C,D)

Dwa powyższe indeksy będą prawie identyczne. Za pomocą stron indeksu wyższego poziomu zawierających wartości dla kluczowych kolumn A,Bi stron zawierających liśćA,B,C,D

Może istnieć tylko jeden indeks klastrowany na tabelę, ponieważ same wiersze danych można sortować tylko w jednej kolejności.

Powyższy cytat z książek SQL Server online powoduje wiele zamieszania

Moim zdaniem byłoby to o wiele lepiej sformułowane jako.

Może istnieć tylko jeden indeks klastrowany na tabelę, ponieważ wiersze klastrowego indeksu na poziomie liścia wierszami tabeli.

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.

CREATE TABLE T
  (
     X TINYINT NOT NULL,
     Y CHAR(3000) NULL
  );

CREATE CLUSTERED INDEX ix
  ON T(X);

GO

--Insert 100 rows with values 1 - 100 in random order
DECLARE @C1 AS CURSOR,
        @X  AS INT

SET @C1 = CURSOR FAST_FORWARD
FOR SELECT number
    FROM   master..spt_values
    WHERE  type = 'P'
           AND number BETWEEN 1 AND 100
    ORDER  BY CRYPT_GEN_RANDOM(4)

OPEN @C1;

FETCH NEXT FROM @C1 INTO @X;

WHILE @@FETCH_STATUS = 0
  BEGIN
      INSERT INTO T (X)
      VALUES        (@X);

      FETCH NEXT FROM @C1 INTO @X;
  END

Następnie sprawdź układ strony za pomocą

SELECT page_id,
       X,
       geometry::Point(page_id, X, 0).STBuffer(1)
FROM   T
       CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% )
ORDER  BY page_id

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.

wprowadź opis zdjęcia tutaj

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

ALTER INDEX ix ON T REBUILD;

Mam następujące

wprowadź opis zdjęcia tutaj

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 INCLUDEkolumny -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ą uniquifierdodawane 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

Chociaż dane magazynu kolumn nie są tak naprawdę „klastrowane” na żadnym kluczu, zdecydowaliśmy się zachować tradycyjną konwencję SQL Server dotyczącą odwoływania się do indeksu podstawowego jako indeksu klastrowego.

Martin Smith
źródło
8
@brainstorm tak, jestem tego świadomy. Prawdopodobnie wynika to z frazowania na tej stronie MSDN, ale aby zobaczyć, że frazowanie jest nieco mylące, wystarczy spojrzeć na tematy dotyczące fragmentacji
Martin Smith
12
@brainstorm: To niesamowite, jak niektóre fałszywe wypowiedzi powtarzają się jako ewangelia. Klaster wskazuje, że przynajmniej z punktu widzenia odczytów sekwencyjnych byłoby „pożądane”, aby wiersze były przechowywane fizycznie na dysku w tej samej kolejności co indeks , ale jest to dalekie od stwierdzenia, że ​​spowoduje to, że faktycznie być przechowywane w taki sposób.
supercat
5
@MartinSmith Powtórzyłem i potwierdziłem wyniki twojego testu SQL Server 2014. Otrzymuję 95%fragmentację indeksu po początkowej wstawce. Po index rebuildfragmentacji było 0%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?
gotqn
8
@MartinSmith Teraz, proszę pana, to odpowiedź. Chciałbym zobaczyć to na szczycie listy odpowiedzi, ale w miarę postępowania „szybkie i proste” zyskuje na popularności.
vaitrafra
5
@Manachi ta odpowiedź została udzielona 5 lat po zadaniu pierwotnego pytania. Ma to na celu skorygowanie niektórych mylących aspektów tych odpowiedzi. (8-letnie) kaprysy PO nie są moje. Inni czytelnicy mogą docenić widok niższego poziomu.
Martin Smith
149

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 F736sbyłby, zacznij od zlokalizowania rzędu półek z książkami, który jest oznaczony, 001-099lub 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 - Klnp. „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.

kmote
źródło
2
Być może mógłbym rozszerzyć tę analogię, aby opisać kolumny „Uwzględnione” , które mogą być używane z indeksami nieklastrowanymi: Można sobie wyobrazić kartę w katalogu kart zawierającą więcej niż tylko jedną książkę, ale zamiast tego listę wszystkich opublikowanych wersje książki, uporządkowane numerycznie według daty publikacji. Podobnie jak w „dołączonej kolumnie” ta informacja jest przechowywana tylko na poziomie liścia (zmniejszając w ten sposób liczbę kart, które bibliotekarz musi utworzyć).
kmote
świetna analogia - naprawdę pomaga to zwizualizować!
Denis
71

Znajdź poniżej niektóre cechy indeksów klastrowanych i nieklastrowanych:

Indeksy klastrowe

  1. Indeksy klastrowe to indeksy, które jednoznacznie identyfikują wiersze w tabeli SQL.
  2. Każda tabela może mieć dokładnie jeden indeks klastrowany.
  3. Możesz utworzyć indeks klastrowy obejmujący więcej niż jedną kolumnę. Na przykład: create Index index_name(col1, col2, col.....).
  4. Domyślnie kolumna z kluczem podstawowym ma już klastrowany indeks.

Indeksy nieklastrowane

  1. Indeksy nieklastrowane są jak indeksy proste. Są one po prostu używane do szybkiego wyszukiwania danych. Nie jestem pewien, czy masz unikalne dane.
Anirudh Sood
źródło
34
Jedna lekka korekta do punktu 1. klastrowym indeksie nie nie koniecznie jednoznacznie identyfikują wiersze w tabeli SQL. Taka jest funkcja KLUCZA PODSTAWOWEGO
Nigela
4
@Nigel, KLUCZ PODSTAWOWY czy UNIKALNY INDEKS?
anar khalilov
praktyczna i bezpośrednia odpowiedź, dzięki @Anirudh Sood
Oscar Romero
50

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.

Dan Diplo
źródło
47

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.

  • „ Książka chemii ” przy wpatrywaniu się ma osobny indeks do wskazania lokalizacji rozdziału, a przy „KONIEC” inny indeks wskazujący wspólną lokalizację SŁÓW
abdul rehman kk
źródło
6

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

marvelTracker
źródło
4

Pozwólcie, że podam definicję podręcznika dotyczącą „indeksu klastrowania”, zaczerpniętą z 15.6.1 z Database Systems: The Complete Book :

Możemy również mówić o indeksach klastrowych , które są indeksami na atrybucie lub atrybutach, tak że wszystkie krotki ze stałą wartością dla klucza wyszukiwania tego indeksu pojawiają się na mniej więcej blokach, które mogą je pomieścić.

Aby zrozumieć definicję, spójrzmy na przykład 15.10 dostarczony przez podręcznik:

Relacja R(a,b)sortowana według atrybutów ai przechowywana w tej kolejności, zapakowana w bloki, jest z pewnością klastrowana. Indeks włączony ajest indeksem klastrowym, ponieważ dla danej wartości aa1 wszystkie krotki o tej wartości asą kolejne. Wyglądają zatem na spakowane w bloki, prawdopodobnie w pierwszym i ostatnim bloku, który zawiera a-wartość a1, jak zasugerowano na ryc. 15.14. Jednak indeks na b raczej nie jest klastrowany, ponieważ krotki ze stałą wartością bbędą rozłożone w całym pliku, chyba że wartości ai bsą bardzo ściśle skorelowane.

Ryc. 15.14

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

Indeks atrybutów A w pliku jest indeksem klastrowym, gdy: Wszystkie krotki z wartością atrybutu A = a są przechowywane sekwencyjnie (= kolejno) w pliku danych

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”.

xxks-kkk
źródło
3

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ę.

Abhishek Duppati
źródło
2

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

  1. Może być tylko jeden indeks klastrowany na tabelę. Można jednak utworzyć wiele indeksów nieklastrowych w jednej tabeli.
  2. Indeksy klastrowe sortują tylko tabele. Dlatego nie zużywają dodatkowego miejsca. Indeksy nieklastrowane są przechowywane w oddzielnym miejscu od faktycznej tabeli, która zajmuje więcej miejsca.
  3. Indeksy klastrowe są szybsze niż indeksy nieklastrowane, ponieważ nie wymagają żadnego dodatkowego kroku wyszukiwania.

Aby uzyskać więcej informacji, zapoznaj się z tym artykułem.

Santhoopa Jayawardhana
źródło