Gdy chcę, aby kolumna miała odrębne wartości, mogę użyć ograniczenia
create table t1(
id int primary key,
code varchar(10) unique NULL
);
go
lub mogę użyć unikalnego indeksu
create table t2(
id int primary key,
code varchar(10) NULL
);
go
create unique index I_t2 on t2(code);
Kolumny z unikalnymi ograniczeniami wydają się być dobrymi kandydatami na unikalne indeksy.
Czy istnieją znane powody, aby używać unikalnych ograniczeń i zamiast tego używać unikalnych indeksów?
Odpowiedzi:
Pod maską stosowane jest unikalne ograniczenie w taki sam sposób, jak unikalny indeks - indeks jest potrzebny, aby skutecznie spełnić wymóg wymuszenia ograniczenia. Nawet jeśli indeks został utworzony w wyniku ograniczenia UNIKALNEGO, planista zapytań może go używać tak jak każdego innego indeksu, jeśli uzna to za najlepszy sposób podejścia do danego zapytania.
Tak więc w przypadku bazy danych obsługującej obie funkcje wybór opcji często sprowadza się do preferowanego stylu i spójności.
Jeśli planujesz używać indeksu jako indeksu (tzn. Twój kod może polegać na szybkim wyszukiwaniu / sortowaniu / filtrowaniu tego pola), wolałbym wyraźnie użyć unikalnego indeksu (i skomentować źródło), a nie ograniczenia, aby to zrobić jasne - w ten sposób, jeśli wymóg unikatowości zostanie zmieniony w późniejszej wersji aplikacji, którą Ty (lub inny koder) będziesz wiedział, aby upewnić się, że indeks unikalny zostanie wstawiony w miejsce unikatowego indeksu (usunięcie pojedynczego ograniczenia spowoduje usunięcie indeks całkowicie). Określony indeks można również nazwać wskazówką dotyczącą indeksu (tj. Z (INDEX (ix_index_name)), co nie wydaje mi się, że ma to miejsce w przypadku indeksu utworzonego za kulisami do zarządzania wyjątkowością, ponieważ prawdopodobnie nie znasz jego nazwy.
Podobnie, jeśli musisz wymusić unikalność jako regułę biznesową, a nie pole, które trzeba przeszukać lub użyć do sortowania, użyłbym ograniczenia, ponownie, aby zamienić użycie bardziej oczywistym, gdy ktoś inny patrzy na twoją definicję tabeli.
Zauważ, że jeśli użyjesz zarówno unikalnego ograniczenia, jak i unikalnego indeksu w tym samym polu, baza danych nie będzie wystarczająco jasna, aby zobaczyć duplikację, więc otrzymasz dwa indeksy, które zajmą dodatkowe miejsce i spowolnią wstawianie / aktualizację wierszy.
źródło
CREATE TABLE #T(X INT CONSTRAINT PK PRIMARY KEY NONCLUSTERED);SELECT * FROM #T WITH(INDEX(PK)) WHERE X = 1
. Indeksy mogą być bardziej elastyczne, ponieważ ograniczenia nie obsługują wszystkich opcji indeksów, takich jakINCLUDE
kolumny d lub indeksy filtrowane.Oprócz punktów w innych odpowiedziach, oto kilka kluczowych różnic między nimi.
Uwaga: komunikaty o błędach pochodzą z SQL Server 2012.
Błędy
Naruszenie ograniczenia unikalnego zwraca błąd 2627.
Naruszenie unikalnego indeksu zwraca błąd 2601.
Wyłączanie
Unikalne ograniczenie nie może zostać wyłączone.
Ale unikalny indeks stojący za ograniczeniem klucza podstawowego lub unikatowy może zostać wyłączony, podobnie jak każdy unikalny indeks. Kapelusz Brain2000.
Zwróć uwagę na zwykłe ostrzeżenie, że wyłączenie indeksu klastrowego powoduje, że dane są niedostępne.
Opcje
Unikalne ograniczenia obsługują opcje indeksowania takie jak
FILLFACTOR
iIGNORE_DUP_KEY
, chociaż nie było tak w przypadku wszystkich wersji SQL Server.Zawarte kolumny
Indeksy nieklastrowane mogą zawierać nieindeksowane kolumny (nazywane indeksem kryjącym, jest to znaczące zwiększenie wydajności). Indeksy za ograniczeniami PRIMARY KEY i UNIQUE nie mogą zawierać kolumn. Hat-tip @ypercube.
Filtracja
Ograniczenia unikatowego nie można filtrować.
Unikalny indeks można filtrować.
Ograniczenia klucza obcego
Ograniczenie klucza obcego nie może odwoływać się do przefiltrowanego indeksu unikalnego, chociaż może odwoływać się do niefiltrowanego indeksu unikalnego (myślę, że został on dodany w SQL Server 2005).
Nazewnictwo
Podczas tworzenia wiązania określenie nazwy wiązania jest opcjonalne (dla wszystkich pięciu typów wiązań). Jeśli nie podasz nazwy, MSSQL wygeneruje ją dla Ciebie.
Podczas tworzenia indeksów musisz podać nazwę.
Hat-tip @ i-one.
Spinki do mankietów
http://technet.microsoft.com/en-us/library/aa224827(v=SQL.80).aspx
http://technet.microsoft.com/en-us/library/ms177456.aspx
źródło
Aby zacytować MSDN jako wiarygodne źródło:
I...
Inne do: https://technet.microsoft.com/en-us/library/aa224827%28v=sql.80%29.aspx
źródło
Jedną z głównych różnic między ograniczeniem unikalnym a indeksem jest to, że ograniczenie klucza obcego w innej tabeli może odwoływać się do kolumn tworzących ograniczenie unikalne. Nie dotyczy to unikalnych indeksów. Ponadto unikalne ograniczenia są zdefiniowane jako część standardu ANSI, podczas gdy indeksy nie. Wreszcie, uważa się, że istnieje unikalne ograniczenie w dziedzinie logicznego projektowania baz danych (które mogą być wdrażane inaczej przez różne silniki DB), podczas gdy indeks jest aspektem fizycznym. Dlatego unikalne ograniczenie jest bardziej deklaratywne. Wolę unikalne ograniczenie w prawie wszystkich przypadkach.
źródło
W Oracle główna różnica polega na tym, że można utworzyć indeks unikalny dla funkcji, którego nie da się zrobić przy unikalnych ograniczeniach:
Na przykład
fk_xyz
Jest więc wyjątkowy tylko dla rekordów, które mająamount != 0
.źródło
WHERE
klauzuli.CREATE UNIQUE NONCLUSTERED INDEX P4_U ON DBO.P4 ( PID ) WHERE TXT = 'qwert' ;
Ograniczenie UNIQUE jest preferowane w stosunku do indeksu UNIQUE. Jeśli ograniczenie nie jest unikalne, musisz użyć zwykłego lub nie unikalnego indeksu. Ograniczenie to także inny rodzaj indeksu. Indeks służy do szybszego dostępu.
Unikalne indeksy mogą zawierać klauzule where. Na przykład możesz tworzyć indeksy dla każdego roku na podstawie kolumny daty
źródło