Kann ein TABLE
einen Primärschlüssel ohne Clustered-Index haben?
Und kann ein TABLE
Clustered-Index ohne Primärschlüssel haben?
Kann mir jemand kurz die Beziehung zwischen Primärschlüssel und Clustered-Index erklären?
Kann ein TABLE
einen Primärschlüssel ohne Clustered-Index haben?
Und kann ein TABLE
Clustered-Index ohne Primärschlüssel haben?
Kann mir jemand kurz die Beziehung zwischen Primärschlüssel und Clustered-Index erklären?
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.
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
nonclustered
Option explizit an .Ein Beispiel, bei dem
t1
eint2
nicht gruppierter Primärschlüssel vorhanden ist und nicht gruppiert ist, sondern ein Primärschlüssel vorhanden ist:Beispiel bei SQL Fiddle.
quelle
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 ...
Ja, verwenden Sie das Schlüsselwort NONCLUSTERED, wenn Sie Ihren Primärschlüssel deklarieren, um eine Heap-basierte Tabelle zu erstellen. Beispielsweise:
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).
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:
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.
Unter MS SQL Server wird der Primärschlüssel standardmäßig auch geclustert . Sie können diese Standardeinstellung wie oben beschrieben ändern.
quelle
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.
quelle
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.
quelle
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.
quelle