Feststellen, ob die automatische Statistikaktualisierung ausgeführt wird

8

In unserem Produktionssystem bleiben Abfragen manchmal stehen. Während des Stillstands wird in sp_whoisactive keine inkrementelle Ressourcennutzung (CPU, Reads) angezeigt, und es erfolgt keine Blockierung.

In der retrospektiven Diagnose können wir sehen, dass sys.dm_db_stats_properties last_updated zu dem Zeitpunkt anzeigt, zu dem die Abfrage "blockiert" wurde.

Was wir tun möchten, ist - wenn wir eine blockierte Abfrage sehen - dann festzustellen, welche automatischen Statistikaktualisierungen ausgeführt werden.

Da wir dies ad-hoc tun möchten und auch die Produktionsleistung nicht beeinträchtigen möchten, ist die Verwendung von Profiler für uns wahrscheinlich keine Option.

(Wenn es keine Möglichkeit gibt, eine Ad-hoc-Bestimmung durchzuführen, müssen wir möglicherweise erweiterte Ereignisse oder eine andere vorbeugende Nachverfolgung mit geringeren Auswirkungen in Betracht ziehen.)

Unsere Version ist 2014, aber Antworten für spätere Versionen wären auch nützlich.

Paul Holmes
quelle

Antworten:

10

SQL Server 2019 hat eine Wartestatistik eingeführt, um dies zu verfolgen. In früheren Versionen bleibt Traces / XE übrig. Siehe meine Beiträge zum neuen Wartestatus:

Um XE in früheren Versionen zu verwenden, möchten Sie nach auto_stats suchen. Eine minimale Sitzung, um Ihnen den Einstieg zu erleichtern, würde folgendermaßen aussehen:

CREATE EVENT SESSION auto_stats
    ON SERVER
    ADD EVENT sqlserver.auto_stats
    ADD TARGET package0.event_file
    ( SET filename = N'auto_stats' );

Obwohl Sie es wahrscheinlich mit einer gewissen Spezifität für Datenbanken oder Tabellen konfigurieren möchten, die Ihnen wichtig sind, und ich auf jeden Fall nach Dauer filtern WHERE [duration] > 1000000möchte ( wäre eine Sekunde) oder so, weil es sonst ziemlich laut wäre.

Erik Darling
quelle