2010-07-21 12 views
41

Ich bin interessiert zu lernen, welche Technik Entwickler bevorzugen, um die Eindeutigkeit in SQL Server zu erzwingen: UNIQUE CONSTRAINT oder UNIQUE INDEX. Angesichts der Tatsache, dass es bei der physischen Implementierung der einzelnen wenig Unterschiede gibt, wie entscheiden Sie, welche die beste ist?Unique Constraint vs Unique Index

Gibt es andere Gründe als die Bewertung der besten Lösung?

Gibt es für die eine oder andere Datenbankverwaltung Vorteile?

Antwort

30

Dieser MSDN-Artikel Vergleich der beiden ist für SQL Server 2000: http://msdn.microsoft.com/en-us/library/aa224827(SQL.80).aspx

Für die meisten Zwecke, gibt es keinen Unterschied - die Einschränkung als Index unter die Decke durchgeführt wird. Und obwohl es die Möglichkeit gibt, die Einschränkung zu deaktivieren, funktioniert sie in SQL Server nicht.

Es ist nur wichtig, wenn Sie Dinge wie FILLFACTOR, usw. für die Art, wie Sie die einzigartige Einschränkung implementieren möchten, zwicken wollen.

SQL Server 2008+ hinzugefügt INCLUDE um effizientere Abdeckung Indizes bereitzustellen. Gefilterte Indizes = eindeutige Beschränkung für eine Teilmenge von Zeilen/Ignoriere mehrere Null usw.

+2

hinzufügen Der Artikel ist gut. Es ist interessant, dass es zu dem Schluss kommt, dass es außer Meta-Daten keinen praktischen Unterschied gibt. – bobs

+0

Tut, Tut zitiert MSDN für SQL Server 2000 – gbn

+2

@ gbn: True, aber hat sich etwas geändert? –

26

Sie sind not significantly different. Wenn Sie eine eindeutige Integritätsbedingung erstellen, erstellt SQL Server automatisch einen eindeutigen Index für Sie.

mit der Syntax für einen Index zu schaffen, kann man eine bessere Steuerung, die einen eindeutigen Index haben/nonclustered angeben geclustert, Spalten enthalten, Dateigruppe, index Filterung (SqlSvr2008) usw.

Eine Einschränkung in den meisten bevorzugt ist, Fälle, weil es die Absicht der Einzigartigkeit ausdrückt: es ist eine Einschränkung. Ein Index vermittelt diese Absicht nicht.

Die Auswirkungen sind minimal. Sie können den Index (rebuild, reorg) so verwalten, als wäre er unabhängig von der Einschränkung erstellt worden. Der einzige Unterschied besteht darin, dass die Abhängigkeit vom Index abhängt. Um also den Index zu löschen, müssen Sie auch die Abhängigkeit löschen.

+1

+1 Ich würde auch sagen Konsistenz, sowie Sie am Ende eine Constraint zu einem Index sowieso ändern, um eine INCLUDE – gbn

1

Eine eindeutige Einschränkung bedeutet nur Eindeutigkeit und das Entfernen der Einschränkung entfernt den von der Engine erstellten Index. Ein Index kann geändert werden, um seine Eindeutigkeit zu entfernen, und Sie haben immer noch Ihren Index. Ich denke, man kann davon ausgehen, dass eine Mehrheit der Spalten, in denen man die Eindeutigkeit erzwingen würde, auch als Leistungsindikator dienen würde. Ergo benutze ich meistens eindeutige Indizes. Ich verwende eindeutige Einschränkungen nur für Spalten, die eindeutig sein müssen, aber schlecht für die Leistung dienen (d. H. Ein varchar (200), das eindeutig sein muss); In diesem Fall möchte ich klar darauf hinweisen, dass es einzigartig ist, aber wahrscheinlich nicht so gut, eine Idee, trotz des zugrunde liegenden Index zu suchen.

2

Meine zwei Cent: Ich würde eine Einschränkung verwenden, wenn ich Geschäftslogik und einen Index beschreiben wollte, wenn ich die Leistung verbessern wollte. Die Tatsache, dass sie in einem DBMS gleich implementiert werden können, bedeutet nicht, dass die Unterscheidung zwischen den Gründen für die Definition dieser Objekte nicht signifikant ist.

Verwandte Themen