Sie haben nicht haben , einzigartig zu sein , aber es wird sicherlich dazu ermutigt.
Ich habe noch kein Szenario gefunden, in dem ich ein CI für eine nicht eindeutige Spalte erstellen wollte.
Was passiert, wenn Sie ein CI für eine nicht eindeutige Spalte erstellen ?
Wenn der Clustered-Index kein eindeutiger Index ist, macht SQL Server alle doppelten Schlüssel eindeutig, indem ein intern generierter Wert hinzugefügt wird, der als Uniqueifier bezeichnet wird
Führt dies zu einer schlechten Leistung?
Das Hinzufügen eines Uniqueifizierers erhöht sicherlich den Aufwand beim Berechnen und Speichern.
Ob sich dieser Aufwand bemerkbar macht, hängt von mehreren Faktoren ab.
- Wie viele Daten enthält die Tabelle?
- Wie hoch ist die Anzahl der Einsätze?
- Wie oft wird das CI in einer Auswahl verwendet (wenn keine abdeckenden Indizes vorhanden sind, so ziemlich immer).
Bearbeiten
wie durch Remus in Kommentaren darauf hingewiesen, es existieren Anwendungsfälle , wo eine nicht eindeutige CI Schaffung eine vernünftige Wahl sein würde. Wenn ich nicht auf eines dieser Szenarien gestoßen bin, zeigt dies lediglich meinen eigenen Mangel an Belichtung oder Kompetenz (wählen Sie Ihre Wahl).
Ich möchte herausfinden, was die Königin der Indexierung, Kimberly Tripp, zu diesem Thema zu sagen hat:
Ich werde mit meiner Empfehlung für den Clustering-Schlüssel beginnen - aus mehreren Gründen. Erstens ist es eine einfache Entscheidung, und zweitens hilft eine frühzeitige Entscheidung, einige Arten der Fragmentierung proaktiv zu verhindern. Wenn Sie bestimmte Arten der Fragmentierung von Basistabellen verhindern können, können Sie einige Wartungsaktivitäten minimieren (von denen einige in SQL Server 2000 und weniger in SQL Server 2005 erfordern, dass Ihre Tabelle offline ist. OK, ich komme später zum Wiederaufbau .....
Beginnen wir mit den wichtigsten Dingen, nach denen ich in einem Clustering-Schlüssel suche:
Warum einzigartig? Ein Clustering-Schlüssel sollte eindeutig sein, da ein Clustering-Schlüssel (sofern vorhanden) als Suchschlüssel für alle nicht geclusterten Indizes verwendet wird. Nehmen Sie zum Beispiel einen Index am Ende eines Buches. Wenn Sie die Daten suchen müssen, auf die ein Indexeintrag verweist, muss dieser Eintrag (der Indexeintrag) andernfalls eindeutig sein. Welcher Indexeintrag ist derjenige, nach dem Sie suchen ? Wenn Sie also den Clustered-Index erstellen, muss er eindeutig sein. Für SQL Server ist es jedoch nicht erforderlich, dass Ihr Clustering-Schlüssel in einer eindeutigen Spalte erstellt wird. Sie können es für jede gewünschte Spalte erstellen. Wenn der Clustering-Schlüssel intern nicht eindeutig ist, wird er von SQL Server durch Hinzufügen einer 4-Byte-Ganzzahl zu den Daten "eindeutig". Wenn der Clustered-Index für etwas erstellt wird, das nicht eindeutig ist, entsteht bei der Indexerstellung nicht nur zusätzlicher Aufwand, sondern auch Speicherplatz.
Quelle: Immer mehr Clustering-Schlüsseldebatte - wieder!
quelle
newsequentialid()
, um eine fast sequenzielle GUID zu erhalten. Aber ja: Wenn Sie Ihre eigene eindeutige ID hinzufügen (ich bevorzuge immer INT IDENTITY), haben Sie diesen Wert zur Hand und können ihn verwenden (z. B. um eine FK-Beziehung aufzubauen). Die von SQL Server hinzugefügten Uniquefiers sind für Sie unsichtbar und daher nur Overhead, den Sie nicht nutzen können.Sie tun es nicht und es gibt Zeiten, in denen es besser ist, wenn sie es nicht sind.
Stellen Sie sich eine Tabelle mit einer halbzufälligen, eindeutigen Mitarbeiter-ID und einer Abteilungs-ID für jeden Mitarbeiter vor: Wenn Ihre select-Anweisung lautet
SELECT * FROM EmployeeTable WHERE DepartmentId=%DepartmentValue%
Dann ist es am besten für die Leistung, wenn
DepartmentId
es sich um den Clustered-Index handelt, obwohl (oder sogar besonders, weil) es sich nicht um den eindeutigen Index handelt (am besten für die Leistung, da sichergestellt wird, dass alle Datensätze innerhalb einer bestimmten DepartmentId geclustert werden).Es gibt zum Beispiel Richtlinien für das Design von Clustered - Indizes , die besagen:
Mein Verständnis von "hohem Grad an Einzigartigkeit" ist beispielsweise, dass es nicht gut ist, "Land" als überfüllten Index zu wählen, wenn die meisten Ihrer Abfragen die Datensätze innerhalb einer bestimmten Stadt auswählen möchten.
quelle