Czy można TABLE
mieć klucz podstawowy bez indeksu klastrowego?
I czy może TABLE
mieć indeks klastrowy bez klucza podstawowego?
Czy ktoś może mi krótko opowiedzieć o relacji między kluczem podstawowym a indeksem klastrowym?
Odpowiedzi:
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.
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 nonclustered
opcję.
Przykład, w którym t1
ma nieklastrowy klucz podstawowy i t2
nie 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);
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.
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.
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.
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.