Wenn eine Spalte unterschiedliche Werte haben soll, kann ich entweder eine Einschränkung verwenden
create table t1(
id int primary key,
code varchar(10) unique NULL
);
go
oder ich kann einen eindeutigen Index verwenden
create table t2(
id int primary key,
code varchar(10) NULL
);
go
create unique index I_t2 on t2(code);
Spalten mit eindeutigen Einschränkungen scheinen gute Kandidaten für eindeutige Indizes zu sein.
Gibt es bekannte Gründe, eindeutige Einschränkungen zu verwenden und stattdessen eindeutige Indizes zu verwenden?
Antworten:
Unter der Haube wird eine eindeutige Einschränkung genauso implementiert wie ein eindeutiger Index - ein Index wird benötigt, um die Anforderung zur Durchsetzung der Einschränkung effizient zu erfüllen. Selbst wenn der Index als Ergebnis einer UNIQUE-Einschränkung erstellt wird, kann er vom Abfrageplaner wie jeder andere Index verwendet werden, wenn er dies als die beste Methode zum Annähern an eine bestimmte Abfrage ansieht.
Bei einer Datenbank, die beide Funktionen unterstützt, kommt es daher häufig auf den bevorzugten Stil und die Konsistenz an.
Wenn Sie vorhaben, den Index als Index zu verwenden (dh Ihr Code muss möglicherweise schnell nach diesem Feld suchen / sortieren / filtern), verwende ich explizit einen eindeutigen Index (und kommentiere die Quelle) anstelle einer Einschränkung, um dies zu erreichen Klar - auf diese Weise können Sie (oder ein anderer Programmierer) sicherstellen, dass anstelle des eindeutigen Index ein nicht eindeutiger Index erstellt wird, wenn die Eindeutigkeitsanforderung in einer späteren Version der Anwendung geändert wird (nur das Entfernen einer eindeutigen Einschränkung würde dies beseitigen) den Index vollständig). Ein bestimmter Index kann auch in einem Indexhinweis benannt werden (z. B. WITH (INDEX (ix_index_name)), was meines Erachtens nicht für den Index gilt, der hinter den Kulissen zur Verwaltung der Eindeutigkeit erstellt wurde, da Sie dessen Namen wahrscheinlich nicht kennen.
Wenn Sie nur die Eindeutigkeit als Geschäftsregel erzwingen möchten, anstatt das Feld zu durchsuchen oder zum Sortieren zu verwenden, würde ich die Einschränkung verwenden, um die beabsichtigte Verwendung noch einmal deutlicher zu machen, wenn sich jemand anderes Ihre Tabellendefinition ansieht.
Beachten Sie, dass, wenn Sie sowohl eine eindeutige Einschränkung als auch einen eindeutigen Index für dasselbe Feld verwenden, die Datenbank nicht hell genug ist, um die Duplizierung zu erkennen, sodass Sie am Ende zwei Indizes haben, die zusätzlichen Speicherplatz belegen und Zeileneinfügungen / -aktualisierungen verlangsamen.
quelle
CREATE TABLE #T(X INT CONSTRAINT PK PRIMARY KEY NONCLUSTERED);SELECT * FROM #T WITH(INDEX(PK)) WHERE X = 1
. Indizes können flexibler sein, obwohl Einschränkungen nicht alle Indexoptionen wieINCLUDE
d-Spalten oder gefilterte Indizes unterstützen.Neben den Punkten in anderen Antworten gibt es hier einige wesentliche Unterschiede zwischen den beiden.
Hinweis: Die Fehlermeldungen stammen aus SQL Server 2012.
Fehler
Die Verletzung einer eindeutigen Einschränkung gibt den Fehler 2627 zurück.
Die Verletzung eines eindeutigen Index gibt den Fehler 2601 zurück.
Deaktivieren
Eine eindeutige Einschränkung kann nicht deaktiviert werden.
Der eindeutige Index hinter einer Primärschlüsseleinschränkung oder einer eindeutigen Einschränkung kann ebenso wie jeder eindeutige Index deaktiviert werden. Hutspitze Brain2000.
Beachten Sie die übliche Warnung, dass das Deaktivieren eines Clustered-Index die Daten unzugänglich macht.
Optionen
Einzigartige Einschränkungen unterstützen Indizierungsoptionen wie
FILLFACTOR
undIGNORE_DUP_KEY
, obwohl dies nicht bei allen Versionen von SQL Server der Fall war.Enthaltene Spalten
Nonclustered-Indizes können nicht indizierte Spalten enthalten (Covering-Index genannt, dies ist eine wesentliche Leistungsverbesserung). Die Indizes hinter den Einschränkungen PRIMARY KEY und UNIQUE dürfen keine Spalten enthalten. Hutspitze @ypercube.
Filtern
Eine eindeutige Einschränkung kann nicht gefiltert werden.
Ein eindeutiger Index kann gefiltert werden.
Fremdschlüsseleinschränkungen
Eine Fremdschlüsseleinschränkung kann nicht auf einen gefilterten eindeutigen Index verweisen, obwohl sie auf einen nicht gefilterten eindeutigen Index verweisen kann (ich denke, dies wurde in SQL Server 2005 hinzugefügt).
Benennung
Beim Erstellen einer Einschränkung ist die Angabe eines Einschränkungsnamens optional (für alle fünf Arten von Einschränkungen). Wenn Sie keinen Namen angeben, generiert MSSQL einen für Sie.
Beim Erstellen von Indizes müssen Sie einen Namen angeben.
Hutspitze @ i-one.
Links
http://technet.microsoft.com/en-us/library/aa224827(v=SQL.80).aspx
http://technet.microsoft.com/en-us/library/ms177456.aspx
quelle
So zitieren Sie MSDN als maßgebliche Quelle:
Und...
Andere in: https://technet.microsoft.com/en-us/library/aa224827%28v=sql.80%29.aspx
quelle
Einer der Hauptunterschiede zwischen einer eindeutigen Einschränkung und einem eindeutigen Index besteht darin, dass eine Fremdschlüsseleinschränkung für eine andere Tabelle auf Spalten verweisen kann, aus denen eine eindeutige Einschränkung besteht. Dies gilt nicht für eindeutige Indizes. Darüber hinaus werden eindeutige Einschränkungen als Teil des ANSI-Standards definiert, Indizes jedoch nicht. Schließlich wird die eindeutige Einschränkung im Bereich des logischen Datenbankentwurfs berücksichtigt (der von verschiedenen DB-Engines unterschiedlich implementiert werden kann), während der Index ein physischer Aspekt ist. Daher ist eine eindeutige Einschränkung aussagekräftiger. Ich würde in fast allen Fällen eine eindeutige Einschränkung bevorzugen.
quelle
In Oracle besteht ein wesentlicher Unterschied darin, dass Sie einen funktionsspezifischen Index erstellen können, der mit eindeutigen Einschränkungen nicht möglich ist:
Zum Beispiel
Ist
fk_xyz
also nur einmalig für Rekorde die habenamount != 0
.quelle
WHERE
Klausel gefiltert werden .CREATE UNIQUE NONCLUSTERED INDEX P4_U ON DBO.P4 ( PID ) WHERE TXT = 'qwert' ;
Die UNIQUE-Einschränkung wird gegenüber dem UNIQUE-Index bevorzugt. Wenn die Einschränkung nicht eindeutig ist, müssen Sie einen regulären oder nicht eindeutigen Index verwenden. Einschränkung ist auch eine andere Art von Index. Index wird für einen schnelleren Zugriff verwendet.
Eindeutige Indizes können where-Klauseln enthalten. Beispielsweise können Sie Indizes für jedes Jahr basierend auf der Datumsspalte erstellen
quelle