it-swarm.com.de

Wann sollte ich eine eindeutige Einschränkung anstelle eines eindeutigen Index verwenden?

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 keine eindeutigen Indizes zu verwenden?

210
bernd_k

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 EINZIGARTIGEN Einschränkung erstellt wird, kann der Abfrageplaner ihn wie jeden anderen Index verwenden, wenn er dies als die beste Methode zur Annäherung an eine bestimmte Abfrage ansieht.

Bei einer Datenbank, die beide Funktionen unterstützt, hängt die Auswahl der zu verwendenden Funktionen häufig vom bevorzugten Stil und der Konsistenz ab.

Wenn Sie planen, den Index als Index zu verwenden (dh Ihr Code muss möglicherweise schnell in diesem Feld gesucht/sortiert/gefiltert werden), würde ich explizit einen eindeutigen Index verwenden (und die Quelle kommentieren), anstatt eine Einschränkung, um dies zu erreichen klar - Auf diese Weise können Sie (oder ein anderer Codierer) sicherstellen, dass anstelle des eindeutigen Index ein nicht eindeutiger Index anstelle des eindeutigen Index verwendet wird, wenn die Eindeutigkeitsanforderung in einer späteren Version der Anwendung geändert wird (nur durch Entfernen einer eindeutigen Einschränkung wird diese entfernt den Index vollständig). Ein bestimmter Index kann auch in einem Indexhinweis benannt werden (d. H. WITH (INDEX (ix_index_name)). Dies ist meines Erachtens nicht der Fall für den Index, der hinter den Kulissen zur Verwaltung der Eindeutigkeit erstellt wurde, da Sie seinen Namen wahrscheinlich nicht kennen.

Wenn Sie nur die Eindeutigkeit als Geschäftsregel erzwingen müssen und nicht das Feld, das durchsucht oder zum Sortieren verwendet werden muss, würde ich die Einschränkung verwenden, um die beabsichtigte Verwendung deutlicher zu machen, wenn sich jemand anderes Ihre Tabellendefinition ansieht.

Beachten Sie, dass die Datenbank nicht hell genug ist, um die Duplizierung zu erkennen, wenn Sie sowohl eine eindeutige Einschränkung als auch einen eindeutigen Index für dasselbe Feld verwenden. Daher erhalten Sie zwei Indizes, die zusätzlichen Speicherplatz beanspruchen und Zeileneinfügungen/-aktualisierungen verlangsamen.

165
David Spillett

Zusätzlich zu den Punkten in anderen Antworten gibt es hier einige wesentliche Unterschiede zwischen den beiden.

Hinweis: Die Fehlermeldungen stammen von SQL Server 2012.

Fehler

Die Verletzung einer eindeutigen Einschränkung gibt den Fehler 2627 zurück.

Msg 2627, Level 14, State 1, Line 1
Violation of UNIQUE KEY constraint 'P1U_pk'. Cannot insert duplicate key in object 'dbo.P1U'. The duplicate key value is (1).
The statement has been terminated.

Die Verletzung eines eindeutigen Index gibt den Fehler 2601 zurück.

Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'dbo.P1' with unique index 'P1_u'. The duplicate key value is (1).
The statement has been terminated.

Deaktivieren

Eine eindeutige Einschränkung kann nicht deaktiviert werden.

Msg 11415, Level 16, State 1, Line 1
Object 'P1U_pk' cannot be disabled or enabled. This action applies only to foreign key and check constraints.
Msg 4916, Level 16, State 0, Line 1
Could not enable or disable the constraint. See previous errors.

Der eindeutige Index hinter einer Primärschlüsseleinschränkung oder einer eindeutigen Einschränkung kann jedoch deaktiviert werden, ebenso wie jeder eindeutige Index. Hat-Tip Brain2000.

ALTER INDEX P1_u ON dbo.P1 DISABLE ;

Beachten Sie die übliche Warnung, dass durch Deaktivieren eines Clustered-Index nicht auf die Daten zugegriffen werden kann.

Optionen

Eindeutige Einschränkungen unterstützen Indizierungsoptionen wie FILLFACTOR und IGNORE_DUP_KEY, obwohl dies nicht bei allen Versionen von SQL Server der Fall war.

Enthaltene Spalten

Nicht gruppierte Indizes können nicht indizierte Spalten enthalten (als Deckungsindex bezeichnet, dies ist eine wesentliche Leistungsverbesserung). Die Indizes hinter den Einschränkungen PRIMARY KEY und UNIQUE dürfen keine Spalten enthalten. Hat-tip @ypercube.

Filtern

Eine eindeutige Einschränkung kann nicht gefiltert werden.

Ein eindeutiger Index kann gefiltert werden.

CREATE UNIQUE NONCLUSTERED INDEX Students6_DrivesLicence_u 
ON dbo.Students6( DriversLicenceNo ) WHERE DriversLicenceNo is not null ;

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.

CREATE TABLE dbo.T1 (
    TID int not null PRIMARY KEY
) ;
GO
CREATE TABLE dbo.T2 (
    TID int not null CONSTRAINT T2_pk PRIMARY KEY
) ;

Beim Erstellen von Indizes müssen Sie einen Namen angeben.

Hat-tip @ i-one.

Links

http://technet.Microsoft.com/en-us/library/aa224827 (v = SQL.80) .aspx

http://technet.Microsoft.com/en-us/library/ms177456.aspx

107

So zitieren Sie MSDN als maßgebliche Quelle:

Es gibt keine signifikanten Unterschiede zwischen dem Erstellen einer EINZIGARTIGEN Einschränkung und dem Erstellen eines eindeutigen Index, der von einer Einschränkung unabhängig ist . Die Datenüberprüfung erfolgt auf dieselbe Weise, und das Abfrageoptimierungsprogramm unterscheidet nicht zwischen einem eindeutigen Index, der durch eine Einschränkung erstellt oder manuell erstellt wurde. Durch das Erstellen einer EINZIGARTIGEN Einschränkung für die Spalte wird jedoch das Ziel des Index deutlich ... weitere Informationen hier

Und ...

Das Datenbankmodul erstellt automatisch einen UNIQUE-Index, um die Eindeutigkeitsanforderung der UNIQUE-Einschränkung zu erzwingen. Wenn daher versucht wird, eine doppelte Zeile einzufügen, wird die Das Datenbankmodul gibt eine Fehlermeldung zurück, die besagt, dass die UNIQUE-Einschränkung verletzt wurde, und fügt die Zeile nicht zur Tabelle hinzu. Sofern kein Clustered-Index explizit angegeben wird, wird standardmäßig ein eindeutiger, nicht Clustered-Index erstellt, um die UNIQUE-Einschränkung zu erzwingen ... weitere Informationen hier

Andere in: https://technet.Microsoft.com/en-us/library/aa224827%28v=sql.80%29.aspx

10
user919426

Einer der Hauptunterschiede zwischen einer eindeutigen Einschränkung und einem eindeutigen Index besteht darin, dass eine Fremdschlüsseleinschränkung in einer anderen 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 davon ausgegangen, dass eine eindeutige Einschränkung im Bereich des logischen Datenbankdesigns liegt (das von verschiedenen DB-Engines unterschiedlich implementiert werden kann), während der Index ein physischer Aspekt ist. Daher ist eine eindeutige Einschränkung deklarativer. Ich würde in fast allen Fällen eine eindeutige Einschränkung bevorzugen.

7
Dmitry Frenkel

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

create unique index ux_test on my_table (case when amount != 0 then fk_xyz end);

fk_xyz Ist also nur für Datensätze eindeutig, die amount != 0 Haben.

1
Amir Pashazadeh