Czy w Oracle jest SQL Server 2008 odpowiednik klauzuli USING INDEX? Specjalnie dla konstruktu:
CREATE TABLE c(c1 INT, c2 INT);
CREATE INDEX ci ON c (c1, c2);
ALTER TABLE c ADD CONSTRAINT cpk PRIMARY KEY (c1) USING INDEX ci;
W dokumentacji serwera Sql na temat unikalnych indeksów stwierdza (podkreślenie dodane):
Unikalne indeksy są implementowane w następujący sposób:
KLUCZ PODSTAWOWY lub UNIKALNE ograniczenie
Podczas tworzenia ograniczenia KLUCZ PODSTAWOWY unikalny indeks klastrowy w kolumnie lub kolumnach jest tworzony automatycznie, jeśli indeks klastrowany w tabeli już nie istnieje i nie określono unikalnego indeksu nieklastrowego . Kolumna klucza podstawowego nie może dopuszczać wartości NULL.
Co wydaje się sugerować, że istnieje sposób określenia, jakiego indeksu należy użyć dla klucza podstawowego.
create table c (c1 int not null primary key, c2 int)
Odpowiedzi:
Nie. Po utworzeniu klucza podstawowego lub unikalnego ograniczenia w SQL Server unikalny indeks wspierający to ograniczenie jest tworzony automatycznie, z tymi samymi kluczami.
Nie. Dokumentacja próbuje jedynie wyjaśnić, czy automatyczny indeks pomocniczy zostanie utworzony jako klastrowany czy nieklastrowany, jeśli nie zostanie określony. Zgadzam się, że jest myląco sformułowany.
Aby to wyjaśnić, po dodaniu ograniczenia klucza podstawowego do istniejącej tabeli bez wyrażania preferencji indeks pomocniczy zostanie zgrupowany, jeśli w tabeli nie będzie wcześniej istniejącego indeksu klastrowego. Indeks pomocniczy zostanie utworzony jako nieklastrowany, jeśli istnieje już indeks klastrowany
Możesz w szczególności zażądać klastrowanego lub nieklastrowanego klucza podstawowego, używając:
PRIMARY KEY CLUSTERED
lubPRIMARY KEY NONCLUSTERED
.W uczciwości dokumentacja jest znacznie jaśniejsza na ten temat pod adresem:
table_constraint (Transact-SQL)
źródło
Składnia programu SQL Server do tworzenia indeksu klastrowego, który jest również kluczem podstawowym, to:
Jeśli chodzi o komentarz: „zmuszenie PK do użycia nazwanego indeksu”, powyższy kod spowoduje, że indeks klucza podstawowego będzie miał nazwę „PK_c”.
Klucz podstawowy i klucz klastrowania nie muszą być tymi samymi kolumnami. Możesz je zdefiniować osobno. W powyższym przykładzie zmień
CLUSTERED
słowo kluczowe naNONCLUSTERED
, a następnie po prostu dodaj indeks klastrowy, używającCREATE INDEX
składni:W SQL Server indeks klastrowy jest tabelą, są one takie same. Indeks klastrowy określa logiczną kolejność wierszy przechowywanych w tabeli. W moim pierwszym przykładzie wiersze są przechowywane w kolejności wartości
c1
ic2
kolumn. Ponieważ klucz klastrowania jest również definiowany jako klucz podstawowy, kombinacjac1
ic2
musi być unikalna dla całej tabeli.W drugim przykładzie klucz podstawowy składa się z kolumn
c1
ic2
, jednak klucz klastrowania jest tylkoc2
kolumną. Ponieważ nie podałemUNIQUE
atrybutu wCREATE INDEX
instrukcji, klucz klastrowania (c2
) nie musi być unikalny w całej tabeli. „Unikator” zostanie automatycznie utworzony przez SQL Server i dodany do wartości wc2
kolumnie, aby utworzyć klucz klastrowania. Ten klucz klastrowania, ponieważ jest teraz unikalny, będzie następnie używany jako identyfikator wiersza w innych indeksach utworzonych w tabeli.W celu udowodnienia korelacja kluczowych kontroli układu wierszy w pamięci, można użyć funkcji nieudokumentowane,
fn_PhysLocCracker(%%PHYSLOC%%)
. Poniższy kod pokazuje, że wiersze są rozmieszczone na dysku w kolejnościc2
kolumn, które zdefiniowałem jako klucz klastrowania:Wyniki z mojej tempdb to:
Na powyższym obrazie pierwsze trzy kolumny są wyprowadzane z
fn_PhysLocCracker
funkcji, pokazując fizyczną kolejność wierszy na dysku. Możesz zobaczyć, żeslot_id
wartość zwiększa krok blokady oc2
wartość, która jest kluczem do grupowania. Indeks klucza podstawowego przechowuje wiersze w innej kolejności, co można zaobserwować, zmuszając program SQL Server do zwracania wyników skanowania klucza podstawowego:Uwaga: nie użyłem
ORDER BY
klauzuli w powyższej instrukcji, ponieważ próbuję pokazać kolejność elementów w indeksie klucza podstawowego.Dane wyjściowe z powyższego zapytania to:
Patrząc na
fn_PhysLocCracker
funkcję, możemy zobaczyć fizyczną kolejność indeksu klucza podstawowego.Ponieważ czytamy wyłącznie z samego indeksu, tzn. W zapytaniu nie ma odniesienia do żadnych kolumn poza indeksem,
%%PHYSLOC%%
wartości reprezentują strony w samym indeksie.Wyniki:
źródło