Indizes und Statistiken zu temporären Tabellen

7

Ich habe gerade unser Data Warehouse auf SQL 2016 aktualisiert. Ich sehe einige wirklich interessante Grafiken im Query Store (ich liebe diese Funktion!). Unten ist das seltsamste Beispiel, das ich je gesehen habe. 22 Pläne für dieselbe Abfrage.

Geben Sie hier die Bildbeschreibung ein

Ich denke über die Leistungsoptimierung meines ETL-Prozesses und die Vor- und Nachteile temporärer Tabellen nach und darüber, wie Sie das Verhalten des Ausführungsplans beeinflussen können.

Mein ETL-Prozess verwendet eine Reihe gespeicherter Prozeduren, die eine Mischung aus Standard- und temporären # -Tabellen als Staging-Tabellen verwenden. Die # -Tabellen werden normalerweise einmal verwendet und dann gelöscht. Einige sind nur ein paar tausend Zeilen. Einige sind Millionen. SSMS weist darauf hin, dass Indizes fehlen, aber würden sie bei kleineren Tabellen genug bewirken, um die Mühe des Hinzufügens wert zu sein? Reichen bessere Statistiken aus?

Ich habe gerade diesen Brent Ozar-Blogbeitrag über Statistiken zu temporären Tabellen und Paul Whites Artikel über temporäre Tabellen in gespeicherten Prozeduren gelesen

Es heißt, dass Statistiken automatisch erstellt werden, wenn die # -Tabelle abgefragt und dann vermutlich vom Optimierer verwendet wird.

Meine Fragen sind: Hat es Sinn oder Nutzen, einen Index für eine # -Tabelle zu erstellen? Und / oder: Lohnt es sich, Statistiken als Schritt in der gespeicherten Prozedur explizit zu aktualisieren, bevor Sie sie in Abfragen verwenden, da sie nur einmal verwendet werden.

Lohnen sich die zusätzlichen Schritte und der Aufwand? Würde dies zu deutlich besseren oder anderen Ausführungsplänen führen?

Sir schwört viel
quelle

Antworten:

6

Das Erstellen von Indizes für temporäre Tabellen kann von Vorteil sein, möglicherweise jedoch nicht für eine Staging-Tabelle. Es ist leider eine "es kommt darauf an" Antwort. Sie müssen testen. Wenn Sie den Code für die Interaktion mit der Staging-Tabelle veröffentlicht haben, können wir Ihnen helfen, festzustellen, ob Indizes hilfreich sind. Ein Beispiel dafür, wo ein Index hilfreich sein könnte, ist, wenn Sie die temporäre Tabelle mit einer anderen Tabelle verknüpfen. Wenn Sie die verknüpfte Spalte indizieren, kann dies zu Leistungssteigerungen führen, insbesondere wenn die temporäre Tabelle viele Zeilen enthält.

Sie müssen wahrscheinlich keine Statistiken für die temporären Tabellen aktualisieren. Es ist auch eine "es hängt davon ab" -Antwort, obwohl ich noch nie eine Aktualisierungsstatistik für temporäre Tabellen in einer der Tausenden und Abertausenden von gespeicherten Prozeduren gesehen habe, die ich mir angesehen habe, und ich musste sie auch nicht hinzufügen, um ein Leistungsproblem zu beheben.

Tara Kizer
quelle
4

Statistiken allein reichen nicht aus. Die Speicher-Engine muss eine Möglichkeit haben, zu den Zeilen zu gelangen, die dem Abfrageprädikat entsprechen. Es hat keinen Wert zu wissen, dass beispielsweise drei Zeilen mit der Bedingung von einer Million in der Tabelle übereinstimmen, wenn nicht festgestellt werden kann, um welche drei es sich handelt. Ohne Index ist die einzige Strategie ein Tabellenscan. Eine Million Zeilen werden gelesen. 99,9997% werden verworfen. Mit einem passenden Index können die Zeiger befolgt werden, um nur die drei erforderlichen Zeilen auszuwählen.

Bei kleinen Tabellen, die nur wenige Seiten benötigen, muss der Aufwand zum Lesen der Indexseiten berücksichtigt werden. Angenommen, ein nicht gruppierter Index, der genau mit der Abfrage übereinstimmt, benötigt nur zwei Ebenen. Das sind zwei Seitenlesungen, um den Tasten zu folgen. Dann folgt der Clustered-Index. Das könnten zwei weitere Seitenlesungen sein. Wenn die gesamte Tabelle weniger als 4 Seiten umfasst, wird dieser nicht gruppierte Index wahrscheinlich nicht verwendet.

Michael Green
quelle