Database
 sql >> Datenbank >  >> RDS >> Database

Nachverfolgung automatischer Aktualisierungen von Statistiken

Wenn Sie eine neue Datenbank in SQL Server erstellen, ist die Option Statistik automatisch aktualisieren standardmäßig aktiviert. Es wird generell empfohlen, diese Option aktiviert zu lassen. Idealerweise werden Statistiken von einem geplanten Job verwaltet, und die automatische Option wird als Sicherheitsnetz verwendet – verfügbar, um Statistiken zu aktualisieren, falls eine geplante Aktualisierung nicht erfolgt oder versehentlich nicht alle vorhandenen Statistiken enthält.

Einige DBAs verlassen sich ausschließlich auf automatische Aktualisierungen, um Statistiken zu verwalten, und solange keine Leistungsprobleme im Zusammenhang mit veralteten oder schlecht erfassten Statistiken bestehen, ist dies akzeptabel. Wenn Sie sich zum Verwalten Ihrer Statistiken auf diese Option verlassen und einige sehr große Tabellen haben, lohnt es sich möglicherweise, das Ablaufverfolgungsflag 2371 zu implementieren. Stellen Sie wie bei jedem Ablaufverfolgungsflag sicher, dass Sie mit einer repräsentativen Arbeitslast testen, bevor Sie es in der Produktion implementieren. Möglicherweise wissen Sie bereits, dass es Zeiten gibt, in denen ein automatisches Update die Systemleistung beeinträchtigen kann. Beispielsweise kann die Aktualisierung einer Statistik eine CPU- oder E/A-Spitze verursachen, wenn die Tabellen- oder Indexdaten gelesen werden, sowie die Abfrageausführung verzögern, während die Aktualisierung erfolgt. Es gibt eine weitere Datenbankoption, die Sie aktivieren können, um diese Abfrageverzögerung zu beheben, und darauf werde ich später in diesem Beitrag eingehen.

Die Frage, die mir oft gestellt wird, lautet:"Woher wissen Sie, ob automatische Aktualisierungen der Statistiken verursachend sind Leistungsprobleme?" Eine Option besteht darin, sie zu verfolgen und die Aktualisierungen an eine Leistungsänderung zu binden. Es gibt viele Optionen zum Verfolgen von Aktualisierungen, und in diesem Beitrag werden wir einige der verfügbaren Methoden überprüfen, damit Sie die auswählen und dann implementieren können Option, die am besten zu Ihrer bestehenden Methode zur Überwachung von Leistungsproblemen passt.

SQL-Trace

Wenn Sie in Ihrer Umgebung SQL Server 2008 R2 oder niedriger ausführen, ist die SQL-Ablaufverfolgung eine Methode, die Sie verwenden können, um automatische Updates zu erfassen. Das unten verwendete Trace-Definitionsskript erfasst nur das Auto Stats-Ereignis, das abfängt, wenn eine Statistik automatisch aktualisiert und wenn eine Statistik automatisch erstellt wird. Nachdem dieser Trace eine Weile in Ihrer Umgebung ausgeführt wurde, können Sie ihn in eine Tabelle laden und dann die Ausgabe abfragen, um zu sehen, welche Aktualisierungen aufgetreten sind. Das enthaltene Skript unten führt durch ein Beispiel, das die Baseball-Statistik-Beispieldatenbank verwendet.

Erweiterte Veranstaltungen

Wenn Sie SQL Server 2012 oder höher ausführen, empfehle ich die Verwendung von Extended Events zum Erfassen automatischer Updates. Wie das SQL Trace-Skript erfasst das enthaltene Sitzungsdefinitionsskript nur die Auto Stats-Ereignisse – wiederum sowohl automatische Aktualisierungen als auch automatische Erstellungen. Nachdem die XE-Sitzung eine Weile gelaufen ist, können Sie die Ausgabe über die Benutzeroberfläche in eine Tabelle laden und sie dann abfragen, um zu sehen, welche Aktualisierungen aufgetreten sind. Das enthaltene Skript durchläuft das gleiche Beispiel wie zuvor, verwendet aber dieses Mal erweiterte Ereignisse, um die Daten zu sammeln.

sys.dm_db_stats_properties

Eine dritte Option, die Sie zum Überwachen von Statistikaktualisierungen in Betracht ziehen könnten, ist sys.dm_db_stats_properties DMF, das nur in SQL Server 2008 R2 SP2 und höher und SQL Server 2012 SP1 und höher verfügbar ist. So sehr ich dieses DMF auch liebe, diese Lösung ist schwieriger, um sicherzustellen, dass Sie alle Daten erfasst haben, und die Überprüfung der Ausgabe erfordert mehr Arbeit. Mit dem DMF wird nicht jede automatische Aktualisierung nachverfolgt, wir aktualisieren lediglich die Trendstatistiken, um zu sehen, wann Aktualisierungen auftreten.

Es ist eine einfache Aufgabe:Sie erstellen eine Tabelle, um die Statistikinformationen zu speichern, und erstellen dann regelmäßig Snapshot-Informationen aus dem DMF in die Tabelle. Der Schlüssel hier ist, herauszufinden, wie oft die Daten erfasst werden sollen. Jede Stunde ist wahrscheinlich übertrieben, einmal am Tag ist möglicherweise nicht häufig genug. Ich empfehle, mit einem SQL Agent-Job zu beginnen, der alle vier Stunden einen Snapshot der DMF-Daten erstellt. Lassen Sie das ein paar Tage laufen und überprüfen Sie dann Ihre Daten. Wenn die Statistiken höchstens einmal am Tag aktualisiert werden, können Sie das Intervall auf alle acht oder zwölf Stunden erhöhen. Wenn Statistiken problemlos alle vier Stunden aktualisiert werden, reduzieren Sie Ihr Intervall auf alle zwei Stunden – Sie möchten sicherstellen, dass Sie jede Aktualisierung erfassen. Aus diesem Grund wird für einige Systeme sys.dm_db_stats_properties könnte die Mühe nicht wert sein; eine XE-Session oder Trace könnte einfacher sein.

Ein letztes Beispielskript führt durch ein Beispiel, wie Sie sys.dm_db_stats_properties verwenden würden um Aktualisierungen von Statistiken zu trenden. Beachten Sie, dass dieses Skript nur Statistikinformationen für eine Tabelle erfasst. Wenn Sie das Skript ändern, um jede Tabelle in der Datenbank zu erfassen, müssen viel mehr Daten analysiert werden.

Nächste Schritte

Laden Sie die Beispielskripts herunter und entscheiden Sie, welche Methode Sie verwenden möchten, um Statistikaktualisierungen zu verfolgen.

Sobald Sie die Daten haben, die zeigen, wann automatische Updates auftreten, müssen Sie dies auf bekannte Leistungsprobleme zurückführen. Wenn Sie also keine Leistungsmetriken verfolgen, werden die Daten der automatischen Statistikaktualisierung bei keiner Art von Korrelation helfen. Angenommen, Sie haben Zeitstempel für Leistungsprobleme, können Sie diese mit StartTime vergleichen und EndTime von Trace, der timestamp von XE oder last_updated aus sys.dm_db_stats_properties DMF, um festzustellen, ob die automatische Aktualisierung die Systemleistung beeinträchtigt hat.

Wenn Sie keinen Zusammenhang zwischen den Updates und Leistungsproblemen herstellen können, können Sie Updates als Ursache des Problems ausschließen und sich auf einen anderen Bereich konzentrieren. Wenn die Aktualisierungen die Hauptursache sind, haben Sie zwei Möglichkeiten:Deaktivieren Sie die Option Statistik automatisch aktualisieren oder aktivieren Sie die Option Statistik automatisch asynchron aktualisieren. Beide haben Vor- und Nachteile, die Sie als DBA berücksichtigen müssen.

Statistiken automatisch aktualisieren deaktivieren

Wenn Sie die Option zum automatischen Aktualisieren von Statistiken deaktivieren, sollten Sie Folgendes wissen:

  1. Sie müssen Ihre Statistiken unbedingt über eine Wartungsaufgabe oder einen benutzerdefinierten Job verwalten.
  2. Abfragen werden nicht neu kompiliert, wenn Sie Statistiken in SQL Server 2008 R2 und darunter aktualisieren.

Ich sehe den zweiten Punkt als eine größere Herausforderung an – ich bin ein großer Befürworter der Verwaltung von Statistiken und erwarte, dass DBAs sowieso etwas tun. Das größere Problem ist, dass die Statistiken normal aktualisiert werden führt dazu, dass Abfragen neu kompiliert werden (um die aktualisierten Statistiken zu nutzen), dies nicht treten auf, wenn Sie die Option zum automatischen Aktualisieren von Statistiken deaktiviert haben. Ich habe bereits zuvor darüber geschrieben und empfehle, diese Informationen zu lesen, wenn Sie mit diesem Verhalten nicht vertraut sind. Sehen Sie sich auch einen Folgebeitrag an, um Optionen zur Behebung dieses Problems zu erhalten.

Im Allgemeinen ist dies nicht der Weg, den ich empfehle. Es gibt sehr spezifische Grenzfälle, in denen dies angemessen sein könnte, aber ich würde lieber sehen, dass ein DBA manuelle Aktualisierungen durchführt (durch geplante Jobs), um die automatischen Aktualisierungen zu vermeiden, und die Option als Sicherheitsmaßnahme aktiviert lassen.

Aktivieren der asynchronen automatischen Aktualisierung von Statistiken

Wenn Sie die Option „Statistiken automatisch asynchron aktualisieren“ aktivieren und eine Statistik ungültig gemacht wurde und eine Abfrage ausgeführt wird, die diese Statistik verwendet, wird die Statistik erst nach Abschluss der Abfrage aktualisiert – die Aktualisierung erfolgt asynchron. Der Vorteil hierbei ist, dass die Aktualisierung die ausgeführte Abfrage nicht beeinflusst; Der Nachteil besteht darin, dass die Abfrage den vorhandenen Plan verwendet, der möglicherweise nicht mehr der optimale Plan ist. Ob der Plan noch optimal ist, hängt von Ihrer Arbeitslast ab (z. B. eine Berichtsarbeitslast mit lang andauernden Abfragen). Als DBA müssen Sie die Vor- und Nachteile der Aktivierung dieser Option abwägen und bestimmen, was für Ihre Datenbank am besten ist. Beachten Sie, dass bei Ausführung von SQL Server 2008 bis 2012 mit dieser Einstellung ein Speicherverlust verbunden ist. Microsoft stellt kumulative Updates zur Verfügung, die einen Fix bereitstellen, aber wenn Sie sie noch nicht angewendet haben, stehen Sie vor einer anderen Entscheidung:Wenden Sie das CU an, damit Sie die Option aktivieren können, oder wenden Sie das CU nicht an und aktivieren Sie das nicht Option.

Zusammenfassung

Ob automatische Aktualisierungen von Statistiken die Abfrageleistung beeinträchtigen, können Sie nur feststellen, indem Sie entweder feststellen, dass eine Aktualisierung gleichzeitig mit einem Problem auftritt, oder erfassen, wann Aktualisierungen auftreten, und die Daten mit zusätzlichen Informationen korrelieren, die Sie über Leistungsprobleme erfassen. Die letztere Option ermöglicht es Ihnen, proaktiv zu sein – selbst wenn Sie keine Leistungsprobleme haben, kann es eine gute Idee sein zu wissen, wie oft automatische Updates stattfinden. Häufige Aktualisierungen können bedeuten, dass Sie den Agent-Job, der Statistiken manuell verwaltet, erneut aufrufen müssen. Im Allgemeinen sollten Sie die Option zum automatischen Aktualisieren von Statistiken aktiviert lassen, aber eine Methode zum Verwalten von Statistiken haben und die Option als Sicherheitsnetz verwenden.