Die Frage lautet nicht "Wann sollte die PK NC sein?", Sondern "Was ist der richtige Schlüssel für den Clustered-Index?".
Und die Antwort hängt wirklich davon ab, wie Sie die Daten abfragen . Der Clustered-Index hat einen Vorteil gegenüber allen anderen Indizes: Da er immer alle Spalten enthält, ist er immer abdeckend. Daher müssen Abfragen, die den Clustered-Index nutzen können, keine Lookups verwenden, um einige der projizierten Spalten und / oder Prädikate zu erfüllen.
Ein weiteres Puzzleteil ist, wie ein Index verwendet werden kann . Es gibt drei typische Muster:
- Prüfpunkte, wenn ein einzelner Schlüsselwert im Index gesucht wird
- Bereichsscans, wenn ein Bereich von Schlüsselwerten abgerufen wird
- Auftrag nach Anforderungen, wenn ein Index einen Auftrag erfüllen kann, für den keine Stop-and-Go-Sortierung erforderlich ist
Wenn Sie also Ihre erwartete Auslastung (die Abfragen) analysieren und feststellen, dass eine große Anzahl von Abfragen einen bestimmten Index verwenden würde, weil sie ein bestimmtes Zugriffsmuster verwenden, das von einem Index profitiert, ist es sinnvoll, diesen Index als Clustered-Index vorzuschlagen.
Ein weiterer Faktor ist, dass der gruppierte Indexschlüssel der von allen nicht gruppierten Indizes verwendete Nachschlageschlüssel ist und daher ein breiter gruppierter Indexschlüssel einen Welligkeitseffekt erzeugt und alle nicht gruppierten Indizes verbreitert. Breite Indizes bedeuten mehr Seiten, mehr E / A , mehr Gedächtnis, weniger Güte.
Ein guter Clustered-Index ist stabil und ändert sich während der Lebensdauer der Entität nicht, da eine Änderung der Clustered-Index-Schlüsselwerte bedeutet, dass die Zeile gelöscht und wieder eingefügt werden muss.
Und ein guter Clustered-Index wächst nicht zufällig (jeder neu eingefügte Schlüsselwert ist größer als der vorhergehende), um Seitenteile und Fragmentierung zu vermeiden (ohne mit FILLFACTOR
s herumzuspielen ).
Nachdem wir nun wissen, was ein guter Clustered-Index-Schlüssel ist, entspricht der Primärschlüssel (eine logische Datenmodellierungseigenschaft) den Anforderungen? Wenn ja, sollte die PK geclustert werden. Wenn nein, sollte die PK nicht geclustert sein.
Betrachten Sie zum Beispiel eine Sales Facts-Tabelle. Jeder Eintrag hat eine ID, die der Primärschlüssel ist. Aber die überwiegende Mehrheit der Anfragen nach Daten zwischen einem Zeitpunkt stellen und einem anderen Termine, damit die besten gruppierten Indexschlüssel wären das Verkaufsdatum , nicht die ID . Ein weiteres Beispiel dafür, dass der Clustered-Index vom Primärschlüssel abweicht, ist ein Schlüssel mit sehr geringer Selektivität, wie z. B. eine Kategorie oder ein Status, ein Schlüssel mit nur sehr wenigen unterschiedlichen Werten. Ein gruppierter Indexschlüssel mit diesem Schlüssel mit geringer Selektivität als äußerster linker Schlüssel ist beispielsweise (state, id)
häufig sinnvoll, da bei Bereichsüberprüfungen nach allen Einträgen in einem bestimmten "Status" gesucht wird.
Ein letzter Hinweis zur Möglichkeit eines nicht gruppierten Primärschlüssels über einen Heap (dh es gibt überhaupt keinen gruppierten Index). Dies kann ein gültiges Szenario sein. Der typische Grund dafür ist, dass die Leistung von Masseneinfügungen kritisch ist, da Heaps im Vergleich zu Clustered-Indizes einen erheblich besseren Durchsatz von Masseneinfügungen aufweisen.