Ich habe 200 GB Data Warehouse in SQL Server.
Ich habe bei einigen Abfragen sehr langsame Ausführungszeiten festgestellt. Zum Beispiel 12 Stunden für eine einfache delete
Abfrage mit einem inner join
.
Nachdem ich einige Nachforschungen mit den Ausführungsplänen angestellt habe, habe ich die Statistiken der beiden an der Abfrage beteiligten Tabellen mithilfe der WITH FULLSCAN
Option aktualisiert .
Die Abfrage wird jetzt in weniger als einer Sekunde ausgeführt, sodass die Statistiken anscheinend nicht auf dem neuesten Stand waren.
Ich erwäge, auto update statistics
die Datenbank zu deaktivieren und UPDATE STATISTICS
manuell auszuführen, nachdem das Data Warehouse geladen wurde. Das Data Warehouse wird täglich und nachts schrittweise aus einem Quell-ERP-System geladen.
Habe ich Recht, wenn ich davon ausgehe, dass auto update statistics
Data Warehousing-Szenarien nicht wirklich nützlich sind? Ist es sinnvoller, die Statistiken nach dem Laden der Daten manuell zu aktualisieren?
Antworten:
Hier ist ein Whitepaper darüber, wann die automatische Aktualisierung der Statistiken erfolgt . Hier sind die wichtigsten Punkte im Hinblick auf automatische Aktualisierungen von Statistiken:
@JNK hat in einem Kommentar darauf hingewiesen, dass bei einer Milliarde Zeilen in einer Tabelle 20.000.5000 Schreibvorgänge in die erste Spalte der Statistik erforderlich sind, um eine Aktualisierung auszulösen.
Nehmen wir die folgende Struktur:
Jetzt können wir überprüfen, was im Statistikland passiert ist.
Um jedoch festzustellen, ob dies ein aussagekräftiges statistisches Objekt ist, müssen wir:
Diese Statistik wurde also nicht aktualisiert. Das liegt daran, dass die Statistik anscheinend erst aktualisiert wird, wenn a
SELECT
auftritt, und selbst dannSELECT
muss die Statistik außerhalb dessen liegen, was SQL Server in seinem Histogramm hat. Hier ist ein Testskript, das ich ausgeführt habe, um dies zu testen:Anstatt die auto_update-Statistik blind zu deaktivieren, würde ich versuchen, Ihren Datensatz auf Versatz zu untersuchen. Wenn Ihre Daten einen erheblichen Versatz aufweisen, müssen Sie die Erstellung gefilterter Statistiken in Betracht ziehen und dann entscheiden, ob die manuelle Verwaltung von Statistikaktualisierungen die richtige Vorgehensweise ist.
Um auf Versatz zu analysieren, müssen Sie
DBCC SHOW_STATISTICS(<stat_object>, <index_name>);
(im obigen Skript ohne denWITH STAT_HEADER
) die bestimmte Statistik- / Indexkombination ausführen , die Sie untersuchen möchten. Eine schnelle Möglichkeit, Ihren Versatz in Augenschein zu nehmen, besteht darin, das Histogramm (dritte Ergebnismenge) zu betrachten und die Varianz in Ihrem zu überprüfenEQ_ROWS
. Wenn es ziemlich konsistent ist, ist Ihr Versatz minimal. Um dies zu erhöhen, sehen Sie sich dieRANGE_ROWS
Spalte und die Varianz dort an, da hiermit gemessen wird, wie viele Zeilen zwischen den einzelnen Schritten vorhanden sind. Schließlich können Sie das[All density]
Ergebnis aus derDENSITY_VECTOR
(zweiten Ergebnismenge) entnehmen und mit dem[Rows Sampled]
Wert in derSTAT_HEADER
(ersten Ergebnismenge ) multiplizieren, um zu sehen, wie hoch die durchschnittliche Erwartung für eine Abfrage in dieser Spalte wäre. Sie vergleichen diesen Durchschnitt mit IhremEQ_ROWS
Wenn es viele Stellen gibt, an denen es erheblich variiert, liegt ein Versatz vor.Wenn Sie feststellen, dass Sie einen Versatz haben, müssen Sie einige gefilterte Statistiken zu den Bereichen erstellen, die sehr hoch sind,
RANGE_ROWS
damit Sie zusätzliche Schritte für bessere Schätzungen dieser Werte angeben können.Sobald Sie diese gefilterten Statistiken eingerichtet haben, können Sie die Möglichkeit prüfen, Statistiken manuell zu aktualisieren.
quelle