DBAtlas · Atlas für Datenbankbetrieb

Zustand der Statistiken: wann aktualisiert, wie viele Zeilen geändert

SQL ServerWartung

Befehl

USE [Musteri];
SELECT OBJECT_SCHEMA_NAME(s.object_id) AS schema_name,
       OBJECT_NAME(s.object_id)        AS table_name,
       s.name                          AS stats_name,
       s.auto_created, s.has_filter, s.no_recompute,
       sp.last_updated,
       sp.rows, sp.rows_sampled,
       CAST(100.0 * sp.rows_sampled / NULLIF(sp.rows, 0) AS DECIMAL(5,1))         AS sample_pct,
       sp.modification_counter,
       CAST(100.0 * sp.modification_counter / NULLIF(sp.rows, 0) AS DECIMAL(9,1)) AS modified_pct,
       CAST(CASE WHEN 500 + 0.20 * sp.rows < SQRT(1000.0 * sp.rows) THEN 500 + 0.20 * sp.rows
                 ELSE SQRT(1000.0 * sp.rows) END AS BIGINT)                       AS auto_update_threshold,
       sp.persisted_sample_percent
FROM   sys.stats s
  CROSS APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) sp
WHERE  OBJECTPROPERTY(s.object_id, 'IsUserTable') = 1
ORDER BY sp.modification_counter DESC;

SELECT name, is_auto_create_stats_on, is_auto_update_stats_on, is_auto_update_stats_async_on
FROM   sys.databases
WHERE  name = DB_NAME();

Was es tut

Zeigt für jede Statistik den Zeitpunkt der letzten Aktualisierung, die Sampling-Rate, die seit der letzten Aktualisierung geänderten Zeilen und den Schwellenwert, bei dem Auto Update auslöst (dynamischer Schwellenwert ab Compat 130).

Wann einsetzen

Bei Plänen mit großer Abweichung zwischen geschätzten und tatsächlichen Zeilen, nach einem großen Datenladevorgang oder um zu prüfen, ob der Job zur Statistikpflege wirkt.

Vorsicht

Die Schwellenwertformel gilt ab Compatibility Level 130 (MIN(500 + 20%, SQRT(1000 x rows))); niedrigere Compat Levels nutzen die Regel 20% + 500. Nie aktualisierte Statistiken (leere Tabellen) liefern NULL. Ungleich verteilte Spalten mit niedrigem sample_pct brauchen eventuell FULLSCAN oder PERSIST_SAMPLE_PERCENT. Reine Leseabfrage; sicher.

In DBAtlas öffnen →

Verwandte Einträge