Bei einer Tabelle mit einem Primärschlüssel, z.
CREATE TABLE Customers (
CustomerID int NOT NULL PRIMARY KEY,
FirstName nvarchar(50),
LastName nvarchar(50),
Address nvarchar(200),
Email nvarchar(260)
--...
)
Wir haben einen eindeutigen Primärschlüssel an CustomerID.
Traditionell benötige ich dann möglicherweise einige zusätzliche Deckungsindizes. Zum Beispiel, um schnell einen Benutzer zu finden, indem Sie entweder CustomerIDoder Email:
CREATE INDEX IX_Customers_CustomerIDEmail ON Customers
(
CustomerID,
Email
)
Und das sind die Arten von Indizes, die ich seit Jahrzehnten erstellt habe.
Es muss nicht eindeutig sein, ist es aber tatsächlich
Der Index selbst ist vorhanden, um einen Tabellenscan zu vermeiden. Es handelt sich um einen Deckungsindex, um die Leistung zu verbessern (der Index dient nicht als Einschränkung für die Durchsetzung der Eindeutigkeit).
Heute habe ich mich an ein paar Informationen erinnert - SQL Server kann die Tatsache nutzen, dass:
- Eine Spalte hat eine Fremdschlüsseleinschränkung
- Eine Spalte hat einen eindeutigen Index
- Eine Einschränkung ist vertrauenswürdig
um die Abfrageausführung zu optimieren. In der Tat aus dem SQL Server Index Design Guide :
Wenn die Daten eindeutig sind und die Eindeutigkeit erzwungen werden soll, bietet das Erstellen eines eindeutigen Index anstelle eines nicht eindeutigen Index für dieselbe Spaltenkombination zusätzliche Informationen für das Abfrageoptimierungsprogramm, mit denen effizientere Ausführungspläne erstellt werden können . In diesem Fall wird empfohlen, einen eindeutigen Index zu erstellen (vorzugsweise durch Erstellen einer EINZIGARTIGEN Einschränkung).
Da mein mehrspaltiger Index den Primärschlüssel enthält , ist dieser zusammengesetzte Index de facto eindeutig. Es ist keine Einschränkung, die SQL Server bei jeder Einfügung oder Aktualisierung besonders erzwingen muss. aber die Tatsache ist , dass dieser Nicht-Clustered - Index ist einzigartig.
Gibt es einen Vorteil, diesen de facto eindeutigen Index als tatsächlich eindeutig zu kennzeichnen?
CREATE UNIQUE INDEX IX_Customers_CustomerIDEmail ON Kunden ( Kundennummer, Email )
Es scheint mir, dass SQL Server intelligent genug sein könnte , um zu erkennen, dass mein Index bereits eindeutig ist , da er den Primärschlüssel enthält.
- Aber vielleicht weiß es das nicht und es gibt einen Vorteil für den Optimierer, wenn ich den Index trotzdem als eindeutig deklariere.
- Außer vielleicht könnte dies jetzt zu Verlangsamungen bei Einfügungen und Aktualisierungen führen, bei denen Eindeutigkeitsprüfungen durchgeführt werden müssen - wo zuvor noch nie zuvor.
- Es sei denn, es weiß, dass der Index garantiert bereits eindeutig ist, da er den Primärschlüssel enthält.
Ich kann keine Anleitung von Microsoft finden, was zu tun ist, wenn ein zusammengesetzter Index den Primärschlüssel enthält.
Zu den Vorteilen eindeutiger Indizes gehören:
- Die Datenintegrität der definierten Spalten ist gewährleistet.
- Zusätzliche Informationen, die für das Abfrageoptimierungsprogramm hilfreich sind, werden bereitgestellt.
Sollte ich einen zusammengesetzten Index als eindeutig markieren, wenn er bereits den Primärschlüssel enthält? Oder kann SQL Server dies selbst herausfinden?


