Standardmäßig ist die PK geclustert und dies ist in den meisten Fällen in Ordnung. Welche Frage sollte jedoch gestellt werden:
- sollte meine PK geclustert werden?
- Welche Spalte (n) sind der beste Schlüssel für meinen Clustered-Index?
PK und Clustered Index sind zwei Unterschiede:
- PK ist eine Einschränkung. PK wird verwendet, um Zeilen eindeutig zu identifizieren, es gibt jedoch keine Vorstellung von Speicherung. Standardmäßig (in SSMS) wird dies jedoch durch einen eindeutigen Clustered-Index erzwungen, wenn noch kein Clustered-Index vorhanden ist.
- Clustered-Indizes sind ein spezieller Indextyp, in dem Zeilendaten auf Blattebene gespeichert werden, dh, sie decken immer ab. Alle Spalten, unabhängig davon, ob sie Teil des Schlüssels sind oder nicht, werden auf Blattebene gespeichert. Es muss nicht eindeutig sein. In diesem Fall wird dem gruppierten Schlüssel ein Eindeutiger (4 Byte) hinzugefügt.
Jetzt haben wir zwei Fragen:
- Wie möchte ich Zeilen in meiner Tabelle (PK) eindeutig identifizieren?
- Wie möchte ich es auf der Blattebene eines Index speichern (Clustered Index)
Es kommt darauf an, wie:
- Sie entwerfen Ihr Datenmodell
- Sie fragen Ihre Daten ab und Sie schreiben Ihre Abfragen
- Sie fügen Ihre Daten ein oder aktualisieren sie
- ...
Benötigen Sie zunächst einen Clustered-Index? Wenn Sie eine Masseneinfügung durchführen, ist es effizienter, ungeordnete Daten in einem HEAP zu speichern (im Vergleich zu geordneten Daten in einem Cluster). Es verwendet RID (Row Identifier, 8 Bytes), um Zeilen eindeutig zu identifizieren und auf Seiten zu speichern.
Der Clustered-Index sollte kein zufälliger Wert sein. Die Daten auf Blattebene werden gespeichert und nach dem Indexschlüssel sortiert. Daher sollte es kontinuierlich wachsen, um Fragmentierung oder Seitenteilung zu vermeiden. Wenn dies von der PK nicht erreicht werden kann, sollten Sie einen anderen Schlüssel als Clustered Candidate betrachten. Ein gruppierter Index für Identitätsspalten, eine sequenzielle GUID oder sogar das Datum der Einfügung ist aus sequenzieller Sicht in Ordnung, da alle Zeilen der letzten Blattseite hinzugefügt werden. Auf der anderen Seite sollten eindeutige Bezeichner, die für Ihre geschäftlichen Anforderungen als PK nützlich sein können, nicht zu Clustern zusammengefasst werden (sie werden nach dem Zufallsprinzip sortiert / generiert).
Wenn Sie nach einigen Daten- und Abfrageanalysen feststellen, dass Sie zum Abrufen Ihrer Daten meistens denselben Index verwenden, bevor Sie eine Schlüsselsuche in der Cluster-PK durchführen, können Sie ihn als Cluster-Index betrachten, obwohl er Ihre Daten möglicherweise nicht eindeutig identifiziert.
Der gruppierte Indexschlüssel besteht aus allen Spalten, die Sie indizieren möchten. Eine eindeutigere Spalte (4 Byte) wird hinzugefügt, wenn keine eindeutige Einschränkung vorliegt (inkrementeller Wert für Duplikate, andernfalls null). Dieser Indexschlüssel wird dann einmal für jede Zeile auf Blattebene aller nicht gruppierten Indizes gespeichert. Einige von ihnen werden auch mehrmals in Zwischenebenen (Verzweigungen) zwischen der Wurzel- und der Blattebene des Indexbaums (B-Baum) gespeichert. Wenn der Schlüssel zu groß ist, wird der gesamte nicht gruppierte Index größer, benötigt mehr Speicher und mehr E / A, CPU, Speicher, ... Wenn Sie einen PK für Name + Geburtsdatum + Land haben, ist es sehr wahrscheinlich, dass dieser Schlüssel vorhanden ist ist kein guter Kandidat. Es ist zu groß für einen Clustered-Index. Eindeutiger Bezeichner, der NEWSEQUENTIALID () verwendet, wird normalerweise nicht als schmaler Schlüssel (16 Byte) betrachtet, obwohl er sequentiell ist.
Sobald Sie herausgefunden haben, wie Sie Zeilen in Ihrer Tabelle eindeutig identifizieren können, können Sie eine PK hinzufügen. Wenn Sie glauben, dass Sie es in Ihrer Abfrage nicht verwenden werden, erstellen Sie es nicht in Clustern. Sie können immer noch einen anderen nicht gruppierten Index erstellen, wenn Sie ihn irgendwann abfragen müssen. Beachten Sie, dass der PK automatisch einen eindeutigen Index erstellt.
Die nicht gruppierten Indizes enthalten immer den gruppierten Schlüssel. Wenn sich jedoch die indizierten Spalten (+ Schlüsselspalten) decken, wird im Clustered-Index keine Schlüsselsuche durchgeführt. Vergessen Sie nicht, dass Sie einem nicht gruppierten Index auch Include und Where hinzufügen können. (Benutze es weise)
Der Clustered-Index sollte eindeutig und so eng wie möglich sein. Der Clustered-Index sollte sich im Laufe der Zeit nicht ändern und inkrementell eingefügt werden.
Es ist jetzt an der Zeit, SQL zu schreiben, mit dem die Indizes und Einschränkungen für Tabellen, Clustered und Nonclustered erstellt werden.
Dies ist alles theoretisch, da wir Ihr Datenmodell und die verwendeten Datentypen (A und B) nicht kennen.