Warum ist der Clustered Index für Primärschlüssel obligatorisch?

7

Warum erstellt die Primärschlüsseleinschränkung standardmäßig einen Clustered-Index für die PK-Spalte?

Können wir eine Tabelle erstellen, die einen Primärschlüssel, aber keinen Clustered-Index hat? Ich benötige eine PK-Einschränkung, um die eindeutigen Werte + nicht null in der Spalte beizubehalten, aber ich möchte keinen Clustered-Index, da diese Tabelle zu viele Einfügungen enthält.

Ich habe gelesen, dass ein Clustered-Index Auswirkungen auf die Leistung von Einfügungen hat.


quelle

Antworten:

7

Warum erstellt die Primärschlüsseleinschränkung standardmäßig einen Clustered-Index für die PK-Spalte?

Das ist, was MS-SQL-Server-Programmierer als Standard festgelegt haben. Ein guter Clustered-Index hat eindeutige Werte (als Primärschlüssel), ist eng (wie die meisten Primärschlüssel sind oder zumindest sein sollten) und nimmt ständig zu. In den meisten Fällen ist der Primärschlüssel eine gute (oder die beste) Wahl für den Clusterschlüssel (es kann höchstens einen Clusterschlüssel pro Tabelle geben).

Können wir eine Tabelle erstellen, die einen Primärschlüssel, aber KEINEN Clustered-Index hat?

Ja, du kannst. Indem Sie alle Indizes und insbesondere den Primärschlüssel explizit als nicht gruppiert definieren. Wenn Sie der Meinung sind, dass Sie keinen Clusterschlüssel für eine Tabelle benötigen, können Sie dies tun und den Primärschlüssel als nicht geclustert festlegen. Die eindeutigen und nicht null Einschränkungen werden weiterhin erzwungen.

ypercubeᵀᴹ
quelle
3

Sie sollten in Ordnung sein, die PK explizit als NonClustered zu definieren, und dies wird nicht der Fall sein.

Wenn Sie nichts sagen und noch kein Clustered-Index vorhanden ist, wird die PK standardmäßig als Cluster erstellt.

Jon Egerton
quelle
2

Wenn Ihr gruppierter Primärschlüssel sequentiell ist, sind Einfügungen bis zum Ende kein Problem. Dies ist nur möglich, wenn Sie einen Datensatz einfügen, bei dem der Primärschlüsselwert in der Mitte der vorhandenen Werte liegt. Dadurch werden die Daten neu sortiert, wenn der Primärschlüssel geclustert ist.

Wenn Sie keinen gruppierten Primärschlüssel verwenden, kann es dennoch zu Leistungsproblemen kommen, wenn die Daten des Primärschlüssels auf Datenbankseiten aufgeteilt werden. Sie sollten sich den Füllfaktor ansehen und sicherstellen, dass er groß genug ist, um Einfügungen in der Mitte des Index ohne Seitenfragmentierung zu verarbeiten.

Hier einige gute Referenzen:

James L.
quelle
0

Sie können eine Einschränkung in der Tabelle verwenden, um die gewünschte Einschränkung beizubehalten.

Sie können einen eindeutigen Index für die Spalte erstellen.

Ich bin jedoch nicht mit Leistungsproblemen bei Primärschlüsseln vertraut. Wenn Sie einen automatisch inkrementierenden Primärschlüssel (Identität) haben und nur am Ende Zeilen einfügen, sollte die Leistung kein Problem darstellen.

Gordon Linoff
quelle