Enthaltene Spalte versus gefilterter Index

11

Wir arbeiten derzeit mit der Tabelle tb_tranfers . Diese Tabelle hat 40 Millionen Zeilen und ist ca. 26 GB groß (11 GB Daten, 15 GB Indizes).

10 bis 15% der Zeilen sind weich gelöschte Zeilen ( DeletedDate ist nicht null). Die Anwendung verwendet nur Zeilen, in denen DeletedDate null ist. Alle Abfragen an diese Tabelle enthalten eine entsprechende Klausel.

Diese Tabelle enthält 15 Indizes. Die fehlende Index-DMV enthält Vorschläge zum Erstellen von Indizes mit DeletedDate als eingeschlossener Spalte.

Wäre es hilfreich, einen gefilterten Index WHERE DeleteDdate IS NULLfür alle 11 nicht klassifizierten Indizes zu verwenden? Oder wäre es besser, die DeletedDate- Spalte als eingeschlossene Spalte zu haben?

Paul White 9
quelle

Antworten:

12

Ja, es CREATE INDEX ... ON ... WHERE DeletedDate IS NULLwürde helfen , alle 11 NC-Indizes so zu ändern, dass sie gefiltert werden ( ). Auf diese Weise erhalten Sie zwei Vorteile:

  • Der Query Optimizer wird wissen , dass jede Zeile aus diesem Indizes kommt schon nicht Ihre Abfragefilter auf DeletedDate erfüllen, so wird es nicht den Clustered - Index zu überprüfen Nachschlag muß die DeletedDate
  • Alle NC-Indizes sind 10-15% kleiner und erfordern weniger Speicher und weniger E / A-Operationen zum Nachschlagen.

Der Nachteil ist, dass jede Abfrage, die sich um weiche gelöschte Zeilen kümmert (und es muss eine Abfrage geben, andernfalls, warum existieren die Zeilen?), Diese NC-Indizes nicht verwenden kann.

Remus Rusanu
quelle
7

Wenn Sie den Filter IMMERDeletedDate IS NULL in Ihren Abfragen verwenden, werden Sie durch Hinzufügen des Filters wahrscheinlich eine signifikante Leistungssteigerung feststellen.

Die Engine muss viel weniger Seiten überprüfen, um die relevanten Zeilen zu finden, was weniger E / A (und mehr Geschwindigkeit) bedeutet.

Das Hinzufügen als INCLUDEDFeld wäre nutzlos . Da Sie es immer in den Filter aufnehmen (aber wahrscheinlich nie zur SELECT-Liste hinzufügen), wird auf dieses Feld niemals verwiesen, wenn Sie es als hinzufügen INCLUDE.

JNK
quelle
2

Da 85-90% der Zeilen mit DeletedDate NULL sind, ist es unwahrscheinlich, dass die Selektivität eines Index, der nur aus DeletedDate besteht, für SQL ausreicht, um diesen Index zu verwenden. In Verbindung mit anderen selektiveren Spalten sollte das Anhängen von DeletedDate an vorhandene Indizes jedoch einen gewissen Vorteil bringen, wenn die Gesamtselektivität des Index erhöht wird.

Wie JNK sagt, wäre DeletedDate für die Abdeckung von Indizes von geringem Nutzen, es sei denn, Sie verwenden es in der SELECT-Klausel.

Da für Indizes bereits mehr Speicherplatz als für Daten vorhanden ist, möchten Sie möglicherweise auch prüfen, ob die vorhandenen 15 NC-Indizes redundant sind.

StuartLC
quelle