2009-06-25 16 views

Antwort

27

Ist nicht wirklich wichtig - aber ist die DateTime wirklich garantiert einzigartig? Ich würde VERMEIDEN, einen geclusterten Index nur auf eine DateTime zu setzen - ich würde stattdessen eine INT IDENTITY oder BIGINT IDENTITY verwenden und einen regulären nicht geclusterten Index auf DateTime setzen (da das wirklich nicht garantiert ist, einzigartig zu sein ......)

Marc

PS: Wie ein Primärschlüssel, der allgemeine Konsens darüber, was ein Cluster-Schlüssel sollte ist:

  • einzigartige (sonst SQL Server wird "uniquify" durch einen 4- Hinzufügen Byte-Unifier dazu)
  • als schmale wie möglich
  • statische (nie ändern)
  • je zunehmende

die Spalte (n), die den Clusterschlüssel bilden (einschließlich der 4-Byte-uniqueifier) ​​werden zu JEDER EINTRAG in JEDEM nicht gruppierten Index - also möchten Sie diese so schlank wie möglich halten.

PS 2: Die Clusterschlüssel werden jedem nicht gruppierten Index hinzugefügt, da SQL Server so alle Zeilen abruft, wenn der Suchwert im nicht gruppierten Index gefunden wurde. Es ist sozusagen der "Ort" der Reihe in der Datenbank. Daher sollte es einmalig und eng sein.

+0

Ein Clustered-Index muss also eindeutig sein? – Eyvind

+4

Wenn es * NOT * eindeutig ist, dann fügt SQL Server automatisch einen 4-Byte "Unifier" hinzu - wenn immer möglich, versuchen Sie das zu vermeiden! –

+1

Danke, wusste das nicht. Wenn die fragliche Tabelle eine PK hat, die eine eindeutige Kennung ist, wäre es dann besser, den Clustered-Index für das Datetime-Feld UND die PK zu erstellen? – Eyvind

5

diesen http://www.sqlskills.com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering-key.aspx

Lese Wenn auf Datetime-Feld basiert häufig gelesen wurde, ist die gute Wahl ein Verbundschlüssel von Datum und Identität - in dieser Reihenfolge (Datum, Identität).

+3

Ich kann nicht betonen, wie hilfreich es sein kann, Ihre DateTime als erstes Feld in einem zusammengesetzten gruppierten Schlüssel zu haben. Es mag nicht mit dem perfekten Modell übereinstimmen, dass es immer eine int-Identität hat, aber wenn Sie beispielsweise innerhalb der letzten 1 Stunde ständig Log-Einträge abfragen, bietet sich das Problem an, eine DateTime als Teil des Primärschlüssels zu haben. Vor allem, wenn Ihr DateTime-Feld weniger als 95% selektiv ist (was viele nicht eindeutige Werte bedeutet), ist es die Art, wie Sie den Index schlagen und Ihre Leistung erhalten, die Sie erwarten würden. – AndyClaw

Verwandte Themen