Warum sollte die automatische Aktualisierungsstatistik auf "Falsch" gesetzt werden?

10

Ich habe gerade ungefähr 20 Instanzen von SQL Server im Rahmen eines umfassenderen Akquisitionsprojekts geerbt. Ich bin gerade dabei, die Leistung zu bewerten, und ich mag die Art und Weise, wie Wartungspläne implementiert wurden, nicht.

Ich sehe tägliche Neuerstellungen des Blanket-Index (ich kann damit umgehen) und auch tägliche manuelle Aktualisierung der Statistiken.

Etwa die Hälfte der Datenbanken wurde auf Auto Update Statistics = False eingestellt, aus Gründen, die nicht klar sind, außer mir wurde gesagt, dass es darum geht, "Leistungsprobleme" zu reduzieren ...

Ich habe immer daran gedacht und daran gearbeitet, dies auf True zu setzen, und war der Meinung, dass das manuelle Update nicht erforderlich ist, wenn diese Einstellung True ist. Liege ich falsch?

Kann jemand erklären, welchen Vorteil es hätte, wenn dieses Set auf "Falsch" gesetzt wäre, stattdessen aber ein tägliches manuelles Update durchzuführen?

Ich sollte erwähnen, dass einige der Datenbanken sehr transaktionsorientiert sind (Millionen von Einfügungen, Löschungen, Aktualisierungen pro Tag). Andere sind in Bezug auf die Transaktionsraten niedrig und einige sind alles andere als schreibgeschützt. Es gibt jedoch keinen Reim oder Grund, warum die Einstellung für die automatische Aktualisierung auf Falsch gesetzt ist. Es scheint eine Lotterie zu sein.

Molenpad
quelle

Antworten:

6

Sie haben Recht, ich glaube auch, dass in den meisten Fällen der Auto Update statisticsWert auf true gesetzt werden sollte, damit SQL Server entscheiden kann, wann Statistiken aktualisiert werden sollen, und glauben Sie mir, dass dies gute Arbeit leistet. Wenn dies auf true gesetzt ist, stellen Sie sicher, dass die Statistiken über die Verteilung der Daten im Feld aktualisiert werden, was dem Optimierer letztendlich helfen würde, einen besseren Plan vorzubereiten. Das Wichtigste dabei ist, dass die Statistik der automatischen Aktualisierung ausgelöst wird, wenn sich 20% der Daten in der Tabelle ändern. Sie sollten also nicht das Gefühl haben, dass in einer Tabelle mit 100.000 Zeilen, wenn 10 Zeilen aktualisiert werden, die Statusaktualisierung ausgelöst wird.

Eine eingehendere Analyse wird von Paul Randal im Blog " Grundlegendes, wann Statistiken automatisch aktualisiert werden" durchgeführt . Ich habe keinen Nachteil gesehen, wenn diese Option auf true gesetzt ist. Ja, Sie können einige E / A-Aktivitäten sehen, wenn diese Option auf true gesetzt ist.

Eine wichtige Schlussfolgerung, die man aus dem Blog ziehen kann, ist

Selbst wenn eine Statistik aufgrund einer Änderung veraltet ist, wird sie nach Abschluss der Änderung nicht automatisch aktualisiert. Die Statistik wird automatisch aktualisiert, wenn ein Abfrageplan sie das nächste Mal verwendet.

In Fällen, in denen Sie nur Datenbanken gelesen haben oder in denen Sie nur eine Operation auswählen und keine DML-Operation vorliegt, können Sie in diesem Fall die Option auf false setzen, aber es würde wiederum kein Schaden entstehen, wenn Sie sie wahr halten. Wir sehen meistens Datenbanken mit einer gewissen Aktivität.

Shanky
quelle
10

Dies ist zu lang für einen Kommentar, daher werde ich mich einem anderen Fall anschließen, in dem man möglicherweise die Statistiken für die automatische Aktualisierung deaktivieren möchte. Ich habe mit Datenbanken gearbeitet, die OLTP-Workloads mit hohem Volumen und eine strenge SLA für die Abfrageleistung in Millisekunden unterstützen. Fast alle Abfragen waren trivial, wobei viel Wert auf Details zur Abfrage- und Indexoptimierung gelegt wurde, und einige der Tabellen waren ziemlich groß. In dieser Situation war das Aktualisieren von Statistiken in Spitzenzeiten nicht sehr wertvoll, und das automatische Aktualisieren von Statistiken würde die SLA verletzen. Folglich wurde die Wartung außerhalb der Spitzenzeiten über einen geplanten Auftrag durchgeführt.

Eine weitere Option besteht darin, sowohl die Datenbankoptionen AUTO_UPDATE_STATISTICSals auch die AUTO_UPDATE_STATISTICS_ASYNCDatenbankoptionen zu aktivieren. Auf diese Weise können Abfragen mit Ausführungsplänen fortfahren, die auf veralteten Statistiken basieren, anstatt den Aufwand für die synchrone Aktualisierung von Statistiken zu verursachen. Dies ist besonders für eine OLTP-Workload geeignet, sofern der Server so dimensioniert ist, dass er die Abfragearbeitslast und die Aktualisierung der Hintergrundstatistiken berücksichtigt.

Dan Guzman
quelle
Ich habe versucht, mir ein Beispiel zu überlegen, bei dem auto_update_stats tatsächlich Probleme verursachen würde, und dies ist ein großartiges Beispiel - ich würde es zweimal (wenn ich könnte) für die hervorragende Umgehung ebenfalls hochstimmen, um die normale Statistikverzögerung zu vermeiden, die mit a einhergeht Abfrage
SqlRyan
1
Ich hatte Situationen mit größeren Datenbanken (VLDB), in denen die Option auto_update stats aktiviert ist und SQL zu ungünstigen Zeiten des Arbeitstages gestartet wird. Ich habe es ausgeschaltet und musste strategischer bei manuellen Aktualisierungen bestimmter Tabellen und Statistiken vorgehen, anstatt den Server die Tabellen bestimmen zu lassen und wann. Dies machte mein System vorhersehbarer, jedoch mit höheren Verwaltungskosten (ohne Zweifel), musste jedoch geschehen, um das Eindringen von Aktualisierungsaufgaben zu vermeiden. Wenn Sie das System mit der typischen Index- / Statistikverwaltung "abdecken" möchten, lassen Sie es eingeschaltet. Andernfalls erfordern einige Situationen möglicherweise eine detaillierte Strategie.
SnapJag
6

Im Allgemeinen würde ich sagen, dass eine automatische Aktualisierung der Statistiken von Vorteil ist. Aber wie bei jeder Einstellung gibt es Gründe, warum Sie sie ein- oder ausschalten können.

Eine davon ist, dass einige Tabellen eine große Abwanderung aufweisen und Abfragen möglicherweise nicht sehr empfindlich auf genaue Statistiken reagieren. Denken Sie an ETL oder andere Massenszenarien, in denen Sie viele Daten ändern, diese aber entweder nicht von dort lesen oder nicht viel lesen. Es macht nicht viel Sinn, automatische Statistikaktualisierungen zu aktivieren und eine Reihe von E / A-Vorgängen zu veranlassen, um genauere Statistiken bereitzustellen, die niemals verwendet werden.

Möglicherweise gibt es auch Szenarien, in denen Sie Daten im Laufe des Tages mehrmals aktualisieren, die Statistiken jedoch nicht unbedingt nach jeder Aktualisierung aktualisieren möchten. (Angenommen, die Daten werden nur zu bestimmten Tageszeiten abgefragt. Sie müssen die Statistiken nicht mehrmals aktualisieren, wenn die Daten in der Zwischenzeit ohnehin nicht abgefragt werden.)

Oder vielleicht haben Sie nur eine hohe Schreiblast. Oder die Lesevorgänge sind in der Regel vollständige Scans, bei denen Statistiken nicht besonders wichtig sind.

Aaron Bertrand
quelle