Clustered Index Betrachtung in Bezug auf unterschiedliche valus und große Ergebnismengen und eine einzige vertikale Tabelle für die Auditierung

Ich habe die besten Praktiken für die Erstellung von gruppierten Indizes erforscht und ich versuche nur, diese beiden Vorschläge, die mit so ziemlich jedem BLOG oder Artikel über die Angelegenheit aufgeführt sind, völlig zu verstehen

  • Spalten, die eine große Anzahl von verschiedenen Werten enthalten.
  • Abfragen, die große Ergebnismengen zurückgeben.

Diese scheinen etwas widersprüchlich zu sein oder ich vermute, vielleicht hängt es einfach davon ab, wie du auf den Tisch zugreifst. Oder meine Interpretation dessen, was "großes Ergebnis" bedeutet, ist falsch …

Es sei denn, du machst Bereichsabfragen über die gruppierte Spalte, es scheint, als würdest du normalerweise keine großen Ergebnismengen bekommen. Also in Fällen, in denen SQL server standardmäßig die gruppierten Indizes auf dem PK setzt, werden Sie selten den großen Ergebnismengenvorschlag erfüllen, aber natürlich ist es die große Anzahl von verschiedenen Werten.

Um die Frage ein wenig mehr Kontext zu geben. Diese Quittierung stammt aus einer vertikalen Auditing-Tabelle, die wir haben, die eine Spalte für TABLE hat …. Jede einzelne Abfrage, die gegen diese Tabelle geschrieben hat, hat eine

WHERE TABLE = 'TABLENAME' 

Aber der TableName ist in hohem Maße nicht unterschiedlich … Jeder Ergebnis Satz von Tablenden ist ziemlich groß, die scheint, diese zweite conditon zu erfüllen, aber es ist definitiv nicht größer einzigartig …. Was bedeutet alles, was andere Sachen passiert mit dem Hinzufügen der 4 Byte Uniquifer (sp?), die den Tisch viel größer macht …

Diese Situation ist ein paar Mal für mich gekommen, wenn ich auf DBs gekommen bin, die den ganzen Kontakt oder einige Konten in einer einzigen Tabelle normalisiert haben und sie sind nur durch einen TYPE-Parameter getrennt. Was ist bei jeder Abfrage ….

Im Falle der Audit-Tabelle sind die Abfragen in der Regel nicht so spannend, entweder sie sind nur nach date sortiert geordnet, manchmal gefiltert durch Spalte, Benutzer, der die Änderung etc …

Mein anderer Gedanke mit diesem Audit-Szenario war, nur die Auditing-Tabelle ein HEAP so dass das Einfügen ist schnell, so gibt es keine Konkurrenz zwischen Tabellen, die geprüft werden und dann zu generierten viewen über die data zu generieren …

Index-Design ist genauso viel Kunst wie es Wissenschaft ist.

Es gibt viele Dinge zu beachten, darunter:

  • Wie wird der Tisch am häufigsten angesprochen: meist Einsätze? irgendwelche Updates? mehr SELECTs als DML-statementen? Jede Audit-Tabelle wird wahrscheinlich meist Einsätze, keine Updates, selten löscht, es sei denn, es gibt eine zeitliche Begrenzung der data und einige SELECTs.
  • Für Clustered-Indizes ist zu beachten, dass die data in jeder Spalte des gruppierten Index in jeden nicht gruppierten Index kopiert werden (wenn auch nicht für UNIQUE Indizes, glaube ich). Dies ist hilfreich, da diese Werte für Abfragen mit dem nicht gruppierten Index für die Abdeckung usw. zur Verfügung stehen. Aber es bedeutet auch, dass der von den nicht gruppierten Indizes aufgenommene physikalische Bereich viel größer ist.
  • Clustered Indizes sollten im Allgemeinen entweder mit dem UNIQUE Keyword deklariert werden oder der Primary Key sein (obwohl es exceptionn natürlich gibt). Ein nicht eindeutiger gruppierter Index wird ein verstecktes 4-Byte-Feld haben, das als ein Bezeichner bezeichnet wird, der erforderlich ist, um jede Zeile mit einem nicht-eindeutigen Schlüsselwert adressierbar zu machen, und ist nur verschwendete Leerzeichen, da die Reihenfolge Ihrer Zeilen innerhalb des Nicht-Unbedingten Gruppierungen ist nicht offensichtlich offensichtlich, so dass versucht, sich zu einer einzigen Reihe zu verengen ist immer noch eine Reihe.
  • Wie überall erwähnt, ist der gruppierte Index die physikalische Reihenfolge der data, so dass Sie auf das, was die beste I / O benötigt, gerecht zu werden. Dies bezieht sich auch auf den Punkt direkt darüber, wo nicht eindeutige gruppierte Indizes eine Reihenfolge haben, aber wenn die data wirklich nicht eindeutig sind (im Gegensatz zu eindeutigen data, aber das UNIQUE Keyword fehlt, wenn der Index erstellt wurde), dann verpassen Sie eine Menge von dem Vorteil, dass die data physisch bestellt wurden.
  • Unabhängig von jeglicher Information oder Theorie, TEST TEST TEST. Es gibt noch viele weitere Faktoren, die sich auf Ihre spezifische Situation beziehen.

Also hast du ein Date Feld sowie den TableName . Wenn die Kombination aus date und Tabellenname eindeutig ist, sollten diese als zusammengesetzter Schlüssel auf einem PK- oder UNIQUE CLUSTERED-Index verwendet werden. Wenn sie nicht sind, dann finden Sie ein anderes Feld, das die Einzigartigkeit schafft, wie UserIDModified .

Während die meisten Empfehlungen das eindeutigste Feld als das erste haben (aufgrund der Statistik, die nur auf dem ersten Feld ist), gilt dies nicht für alle Situationen. Angesichts der Tatsache, dass alle Ihre Abfragen von TableName , würde ich mich dafür entscheiden, dieses Feld zuerst zu verwenden, um die physische Bestellung der data zu nutzen. Auf diese Weise kann SQL server mehr relevante data per Lesen lesen, ohne an andere Orte auf der Festplatte zu suchen. Du würdest wahrscheinlich auch auf dem Date bestellen, damit ich das Feld zweiter geben würde. Das Setzen von TableName zuerst zu einer höheren Fragmentierung über INSERTs führen, als das Date zuerst zu setzen, aber bei einem Index-Wiederaufbau wird der datazugriff schneller, da die data bereits gruppiert ( TableName ) und bestellt ( Date ), wie die Abfragen erwarten. Wenn Sie Date zuerst setzen, dann sind die data immer noch ordnungsgemäß bestellt, aber die Zeilen, die benötigt werden, um die Abfrage zu erfüllen, werden wahrscheinlich über die datadatei verteilt, die mehr I / O benötigen würde, um zu bekommen. UND mehr dataseiten, um die gleiche Abfrage zu erfüllen bedeutet mehr Seiten im Puffer Pool, potenziell drückt andere Seiten und reduzieren Seite Lebenserwartung (PLE). Außerdem müssten Sie dann das datesfeld in allen Abfragen wirklich einschalten, da alle Abfragen, die nur TableName (und möglicherweise auch andere Filter, aber nicht das TableName ), den gruppierten Index scannen oder Sie zwingen, einen nicht gruppierten Index mit TableName zu erstellen zuerst sein

Ich wäre müde von der Heap plus Indexed View-model. Ja, es könnte für die Inserts optimiert werden, aber das System muss noch die data in der indizierten view über alle DML-statementen gegen den Heap pflegen. Wieder musst du testing, aber ich sehe das nicht wesentlich besser als eine gute Auswahl an Feldern für einen gruppierten Index auf dem Audit-Tisch.