Beziehung zwischen Primärschlüssel und Clustered-Index


91

Kann ein TABLEeinen Primärschlüssel ohne Clustered-Index haben?

Und kann ein TABLEClustered-Index ohne Primärschlüssel haben?

Kann mir jemand kurz die Beziehung zwischen Primärschlüssel und Clustered-Index erklären?

Antworten:


102

Ein Primärschlüssel ist ein logisches Konzept - er ist die eindeutige Kennung für eine Zeile in einer Tabelle. Als solches hat es eine Reihe von Attributen - es darf nicht null sein und es muss eindeutig sein. Da Sie wahrscheinlich häufig nach Datensätzen anhand ihrer eindeutigen Kennung suchen, ist es natürlich gut, einen Index für den Primärschlüssel zu haben.

Ein Clustered-Index ist ein physisches Konzept - ein Index, der die Reihenfolge beeinflusst, in der Datensätze auf der Festplatte gespeichert werden. Dies macht es zu einem sehr schnellen Index beim Zugriff auf Daten, obwohl es das Schreiben verlangsamen kann, wenn Ihr Primärschlüssel keine fortlaufende Nummer ist.

Ja, Sie können einen Primärschlüssel ohne Clustered-Index haben - und manchmal möchten Sie dies möglicherweise (z. B. wenn Ihr Primärschlüssel eine Kombination von Fremdschlüsseln in einer Verbindungstabelle ist und Sie keinen Overhead für das Mischen der Festplatte verursachen möchten beim Schreiben).

Ja, Sie können einen Clustered-Index für Spalten erstellen, die kein Primärschlüssel sind.


1
Hallo. Das Thema ist alt, aber vielleicht kann jemand meine Frage beantworten. Wenn die Spalte als NOT NULL UNIQUE CLUSTERED INDEX deklariert ist, ändert sich dann durch PRIMARY KEY tatsächlich die Leistung oder etwas anderes?
Jesse

Das ist eine interessante Frage. Ich würde nein annehmen, da es in beiden Fällen alle gleichen Prüfungen durchführen muss.
Jonathan Allen

Geniale Antwort.
NikosV

Meistens ist jedoch eine Primärschlüsselspalte mit einem Clustered-Index nützlich, da sie die Bereichssuche erheblich vereinfacht.
hunter_tech

33

Eine Tabelle kann einen Primärschlüssel haben, der nicht geclustert ist, und für eine gruppierte Tabelle ist kein Primärschlüssel erforderlich. Die Antwort auf beide Fragen lautet also ja.

Ein Clustered-Index speichert alle Spalten auf Blattebene. Das heißt, ein Clustered-Index enthält alle Daten in der Tabelle. Eine Tabelle ohne Clustered-Index wird als Heap bezeichnet.

Ein Primärschlüssel ist ein eindeutiger Index, der standardmäßig geclustert wird. Standardmäßig bedeutet dies, dass beim Erstellen eines Primärschlüssels, wenn die Tabelle noch nicht geclustert ist, der Primärschlüssel als eindeutiger Clustered-Index erstellt wird. Es sei denn, Sie geben die nonclusteredOption explizit an .

Ein Beispiel, bei dem t1ein t2nicht gruppierter Primärschlüssel vorhanden ist und nicht gruppiert ist, sondern ein Primärschlüssel vorhanden ist:

create table t1 (id int not null, col1 int);
alter table t1 add constraint PK_T1 primary key nonclustered (id);
create clustered index IX_T1_COL1 on t1 (col1);

create table t2 (id int not null, col1 int);
alter table t2 add constraint PK_T2 primary key nonclustered (id);

Beispiel bei SQL Fiddle.


18

Schauen Sie sich zunächst indexorganisierte Tabellen und gruppierte Indizes an . Eigentlich empfehle ich das ganze zu lesen Use the Index Luke! Website von Anfang an, bis Sie das Clustering-Thema erreichen, um wirklich zu verstehen, was los ist.

Nun zu Ihren Fragen ...


Kann eine TABELLE einen Primärschlüssel ohne Clustered Index haben?

Ja, verwenden Sie das Schlüsselwort NONCLUSTERED, wenn Sie Ihren Primärschlüssel deklarieren, um eine Heap-basierte Tabelle zu erstellen. Beispielsweise:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY NONCLUSTERED
    -- Other fields...
);

Dies ist bedauerlich, da viele Leute scheinbar nur die Standardeinstellung (die CLUSTERED ist) akzeptieren, obwohl in vielen Fällen eine Heap-basierte Tabelle tatsächlich besser wäre (wie im verlinkten Artikel beschrieben).


und Kann eine TABELLE einen Clustered-Index ohne Primärschlüssel haben?

Im Gegensatz zu einigen anderen DBMS können Sie mit MS SQL Server einen Clustering-Index erstellen, der sich vom Primärschlüssel unterscheidet, oder sogar ohne den Primärschlüssel.

Im folgenden Beispiel wird ein von der PK getrennter Clustering-Index erstellt, auf dem sich eine EINZIGARTIGE Einschränkung befindet. Dies ist wahrscheinlich in den meisten Fällen der Fall:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY,
    YOUR_CLUSTERED_KEY int NOT NULL UNIQUE CLUSTERED
    -- Other fields...
);

Wenn Sie einen nicht eindeutigen Clustering-Index auswählen (mithilfe von CREATE CLUSTERED INDEX ...), wird er von MS SQL Server automatisch eindeutig, indem ein ausgeblendetes Feld hinzugefügt wird.

Bitte beachten Sie, dass die Vorteile des Clustering bei Bereichsscans am deutlichsten sichtbar sind. Wenn Sie einen Clustering-Index verwenden, der nicht mit den von Ihren Client-Anwendungen durchgeführten Bereichsscans "übereinstimmt" (z. B. wenn Sie sich zu sehr auf die oben erwähnte ausgeblendete Spalte verlassen oder einen Ersatzschlüssel gruppieren ), sind Sie ziemlich genau den Zweck des Clustering zunichte machen.


Kann mir jemand kurz die Beziehung zwischen Primärschlüssel und Clustered-Index erklären?

Unter MS SQL Server wird der Primärschlüssel standardmäßig auch geclustert . Sie können diese Standardeinstellung wie oben beschrieben ändern.


4

Antworten aus MSDN mithilfe von Clustered-Indizes

Kann eine TABELLE einen Primärschlüssel ohne Clustered Index haben? - Ja.

Kann eine TABELLE einen Clustered-Index ohne Primärschlüssel haben? - Ja.

Ein Primärschlüssel ist eine Einschränkung , die die Eindeutigkeit der Werte sicherstellt, sodass eine Zeile immer spezifisch durch diesen Schlüssel identifiziert werden kann.

Ein Index wird automatisch einem Primärschlüssel zugewiesen (da Zeilen häufig von ihrem Primärschlüssel "nachgeschlagen" werden).

Ein nicht gruppierter Index ist eine logische Reihenfolge von Zeilen nach einer (oder mehreren) seiner Spalten. Stellen Sie sich das als eine weitere "Kopie" der Tabelle vor, geordnet nach den Spalten, über die sich der Index erstreckt.

Ein Clustered-Index ist, wenn die tatsächliche Tabelle physisch nach einer bestimmten Spalte geordnet ist. Eine Tabelle hat nicht immer einen Clustered-Index (dh während sie physisch nach etwas geordnet ist , ist dieses Ding möglicherweise undefiniert ). Eine Tabelle kann nicht mehr als einen Clustered-Index haben, obwohl sie einen einzelnen zusammengesetzten Clustered-Index haben kann (dh die Tabelle ist physisch nach Nachname, Vorname, Geburtsdatum geordnet).

Die PK ist oft (aber nicht immer) ein Clustered-Index.


In SQL Server wird der Primärschlüssel standardmäßig geclustert - es sei denn, Sie weisen ausdrücklich an, dass dies nicht der Fall sein soll. Aber das ist nur eine Standardeinstellung - keine Voraussetzung.
marc_s

Kann eine Tabelle einen Primärschlüssel ohne Index haben? Wenn ich sage, dass eine Spalte der Primärschlüssel ist, wird standardmäßig ein Clustered-Index erstellt. Beim Löschen des Index enthält die Tabelle keinen Primärschlüssel mehr?
Veljasije

1

Für das, was es wert sein mag, müssen in MS SQL Server alle Spalten im Primärschlüssel als NOT Null definiert sein, während das Erstellen eines eindeutigen Clustered-Index dies nicht erfordert. Bei anderen DB-Systemen bin ich mir jedoch nicht sicher.


Dies ist eher ein Kommentar unter der als richtig gekennzeichneten Antwort.
Jan Doggen

1
Willkommen - Ich gebe Ihnen eine +1, weil ich sehe, dass Sie noch nicht den Ruf haben, Kommentare hinzuzufügen. (War schon da, hab das gemacht :)
Reversed Engineer

0

Es bezieht sich möglicherweise nicht auf diese Frage, aber einige wichtige Aspekte für Primärschlüssel und Clustered-Indizes sind ->

Wenn es mit Clustered Index einen Primärschlüssel gibt (standardmäßig Clustered Index, den wir jedoch ändern können), können wir keinen weiteren Clustered Index für diese Tabelle erstellen. Wenn jedoch noch kein Primärschlüssel festgelegt ist und ein Clustered-Index vorhanden ist, können wir mit Clustered Index keinen Primärschlüssel erstellen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.