Relacja klucza podstawowego i indeksu klastrowego


92

Czy można TABLEmieć klucz podstawowy bez indeksu klastrowego?

I czy może TABLEmieć indeks klastrowy bez klucza podstawowego?

Czy ktoś może mi krótko opowiedzieć o relacji między kluczem podstawowym a indeksem klastrowym?

Odpowiedzi:


102

Klucz podstawowy to koncepcja logiczna - jest to unikalny identyfikator wiersza w tabeli. W związku z tym ma wiele atrybutów - nie może być zerowy i musi być unikalny. Oczywiście, ponieważ prawdopodobnie będziesz często wyszukiwać rekordy według ich unikatowego identyfikatora, dobrze byłoby mieć indeks na kluczu podstawowym.

Indeks klastrowy to pojęcie fizyczne - jest to indeks, który wpływa na kolejność przechowywania rekordów na dysku. To sprawia, że ​​jest to bardzo szybki indeks podczas uzyskiwania dostępu do danych, chociaż może spowalniać zapis, jeśli klucz podstawowy nie jest liczbą sekwencyjną.

Tak, możesz mieć klucz podstawowy bez indeksu klastrowego - a czasami możesz chcieć (na przykład, gdy twój klucz podstawowy jest kombinacją kluczy obcych w tabeli łączącej i nie chcesz ponosić kosztów tasowania dysku podczas pisania).

Tak, możesz utworzyć indeks klastrowany na kolumnach, które nie są kluczem podstawowym.


1
Cześć. Temat jest stary, ale może ktoś odpowie na moje pytanie. Jeśli kolumna jest zadeklarowana jako NOT NULL UNIQUE CLUSTERED INDEX, czy ustawienie jej PRIMARY KEY spowoduje jakąkolwiek rzeczywistą zmianę wydajności lub cokolwiek?
jesse

To interesujące pytanie. Zakładam, że nie, ponieważ w każdym razie musi wykonać wszystkie te same kontrole.
Jonathan Allen

Świetna odpowiedź.
NikosV

Ale głównie , kolumna klucza podstawowego z indeksem klastrowym będzie przydatna, ponieważ znacznie upraszcza wyszukiwanie zakresów.
hunter_tech

34

Tabela może mieć klucz podstawowy, który nie jest klastrowany, a tabela klastrowana nie wymaga klucza podstawowego. Zatem odpowiedź na oba pytania brzmi: tak.

Indeks klastrowy przechowuje wszystkie kolumny na poziomie liścia. Oznacza to, że indeks klastrowy zawiera wszystkie dane w tabeli. Tabela bez indeksu klastrowego nazywana jest stertą.

Klucz podstawowy to unikalny indeks, który jest domyślnie zgrupowany w klastrze. Domyślnie oznacza, że ​​podczas tworzenia klucza podstawowego, jeśli tabela nie jest jeszcze klastrowana, klucz podstawowy zostanie utworzony jako unikatowy indeks klastrowy. Chyba że wyraźnie określisz nonclusteredopcję.

Przykład, w którym t1ma nieklastrowy klucz podstawowy i t2nie jest klastrowany, ale ma klucz podstawowy:

create table t1 (id int not null, col1 int);
alter table t1 add constraint PK_T1 primary key nonclustered (id);
create clustered index IX_T1_COL1 on t1 (col1);

create table t2 (id int not null, col1 int);
alter table t2 add constraint PK_T2 primary key nonclustered (id);

Przykład w SQL Fiddle.


19

Przede wszystkim przyjrzyj się tabelom zorganizowanym według indeksu i indeksom grupowanym . Właściwie polecam przeczytanie całości Use the Index Luke! witryny od początku, aż przejdziesz do tematu grupowania, aby naprawdę zrozumieć, co się dzieje.

A teraz do twoich pytań ...


Czy TABELA może mieć klucz podstawowy bez indeksu klastrowego?

Tak, użyj słowa kluczowego NONCLUSTERED podczas deklarowania klucza podstawowego, aby utworzyć tabelę opartą na stercie. Na przykład:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY NONCLUSTERED
    -- Other fields...
);

Jest to niefortunne, ponieważ wiele osób wydaje się po prostu akceptować wartość domyślną (która jest KLASTEROWANA), mimo że w wielu przypadkach tabela oparta na stosie byłaby w rzeczywistości lepsza (jak omówiono w połączonym artykule).


i czy TABELA może mieć indeks klastrowany bez klucza podstawowego?

W przeciwieństwie do innych DBMS, MS SQL Server pozwoli ci mieć indeks klastrowy, który różni się od klucza podstawowego lub nawet nie ma go w ogóle.

Poniższy przykład tworzy indeks klastrowy oddzielony od PK, który ma na sobie unikalne ograniczenie, co prawdopodobnie jest tym, czego prawdopodobnie chcesz w większości przypadków:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY,
    YOUR_CLUSTERED_KEY int NOT NULL UNIQUE CLUSTERED
    -- Other fields...
);

W przypadku wybrania nieunikalnego indeksu klastrowania (przy użyciu CREATE CLUSTERED INDEX ...), MS SQL Server automatycznie uczyni go unikalnym, dodając do niego ukryte pole.

Należy pamiętać, że korzyści płynące z grupowania są najbardziej widoczne w przypadku skanowania zakresu. Jeśli używasz indeksu klastrowego, który nie jest „wyrównany” ze skanami zakresu wykonywanymi przez aplikacje klienckie (np. W przypadku nadmiernego polegania na wspomnianej powyżej ukrytej kolumnie lub klastrowania na podstawie klucza zastępczego ), pokonanie celu tworzenia klastrów.


Czy ktoś może mi krótko opowiedzieć o relacji klucza podstawowego i indeksu klastrowego?

W MS SQL Server klucz podstawowy jest również domyślnie zgrupowany w klastrze . Możesz zmienić to ustawienie domyślne, jak omówiono powyżej.


4

Odpowiedzi pobrane z witryny MSDN przy użyciu indeksów klastrowych

Czy TABELA może mieć klucz podstawowy bez indeksu klastrowego? - Tak.

Czy TABELA może mieć indeks klastrowany bez klucza podstawowego? - Tak.

Klucz główny jest przymus , który zapewnia niepowtarzalność wartości, tak, że rząd może być zawsze zidentyfikowane specjalnie do tego klucza.

Indeks jest automatycznie przypisany do klucza podstawowego (jak wiersze są często „wzrok” przez ich klucza podstawowego).

Nieklastrowanym wskaźnik jest logiczną kolejność wierszy, jeden (lub więcej) z jej kolumn. Pomyśl o tym jako o kolejnej „kopii” tabeli, uporządkowanej według kolumn, w których znajduje się indeks.

Skupione wskaźnik jest, gdy rzeczywista tabeli fizycznie zlecenie danej kolumnie. Tabela nie zawsze będzie miała indeks klastrowy (tj. Chociaż będzie przez coś fizycznie uporządkowana , ta rzecz może być niezdefiniowana ). Tabela nie może mieć więcej niż jednego indeksu klastrowego, chociaż może mieć jeden złożony indeks klastrowy (tj. Tabela jest fizycznie uporządkowana np. Według nazwiska, imienia, daty urodzenia).

PK jest często (ale nie zawsze) indeksem klastrowym.


W SQL Server klucz podstawowy zostanie domyślnie zgrupowany w klastry - chyba że wyraźnie zdecydujesz, że tak nie jest. Ale to tylko wartość domyślna, a nie wymóg.
marc_s

Czy tabela może mieć klucz podstawowy bez indeksu? Ponieważ, kiedy mówię, że jedna kolumna jest kluczem podstawowym, domyślnie jest tworzony indeks klastrowy. Po usunięciu indeksu tabela nie zawiera już klucza podstawowego?
veljasije

1

Co może być warte, w MS SQL Server wszystkie kolumny w kluczu podstawowym muszą być zdefiniowane jako NOT Null, a tworzenie unikatowego indeksu klastrowego tego nie wymaga. Nie jestem jednak pewien co do innych systemów DB.


To bardziej komentarz pod odpowiedzią oznaczoną jako poprawną.
Jan Doggen

1
Witaj - daję Ci +1, ponieważ widzę, że nie masz jeszcze reputacji, aby dodawać komentarze. (Byłem tam, zrobiłem to :)
Reversed Engineer

0

Może nie odnosić się do odpowiedzi na to pytanie, ale niektóre ważne aspekty dotyczące klucza podstawowego i indeksów klastrowych to ->

Jeśli istnieje klucz podstawowy (domyślnie jest to indeks klastrowy, jednak możemy to zmienić) z indeksem klastrowym, nie możemy utworzyć jeszcze jednego indeksu klastrowego dla tej tabeli. Ale jeśli nie ma jeszcze zestawu klucza podstawowego i istnieje indeks klastrowy, nie możemy utworzyć klucza podstawowego z indeksem klastrowym.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.