DBAtlas · Atlas für Datenbankbetrieb

Tabellen mit veralteten Statistiken finden (ANALYZE-Strategie)

PostgreSQLWartung

Befehl

SELECT schemaname,
       relname AS table_name,
       n_live_tup,
       n_mod_since_analyze,
       round(100.0 * n_mod_since_analyze / NULLIF(n_live_tup, 0), 1) AS mod_pct,
       greatest(last_analyze, last_autoanalyze) AS last_analyzed,
       round(current_setting('autovacuum_analyze_threshold')::int
             + current_setting('autovacuum_analyze_scale_factor')::numeric * n_live_tup) AS autoanalyze_at
FROM pg_stat_user_tables
WHERE n_mod_since_analyze > 0
ORDER BY mod_pct DESC NULLS LAST
LIMIT 20;

-- After a bulk load, without waiting for autovacuum
ANALYZE (VERBOSE) orders;

Was es tut

Zeigt die Anzahl der seit dem letzten ANALYZE geänderten Zeilen, ihr Verhältnis zu den lebenden Zeilen und die ungefähre Änderungsschwelle, ab der Autovacuum ANALYZE auslöst.

Wann einsetzen

Nach Massenladungen/-löschungen, wenn Pläne falsche Zeilenschätzungen zeigen oder wenn vermutet wird, dass Autoanalyze bei großen Tabellen hinterherhinkt.

Vorsicht

Die berechnete Schwelle nutzt die globalen Einstellungen; gibt es tabellenspezifische autovacuum_analyze_*-Reloptions (pg_class.reloptions), weicht die echte Schwelle ab. Bei großen Tabellen greift der Standard-scale_factor (0.1) viel zu spät; senke ihn je Tabelle. Autovacuum führt kein ANALYZE auf der Parent-Tabelle einer partitionierten Tabelle aus; Statistiken auf Parent-Ebene brauchen ein manuelles ANALYZE. Temporäre Tabellen sieht Autovacuum nie. ANALYZE liest eine Stichprobe und nimmt einen ShareUpdateExclusiveLock (blockiert kein DML).

In DBAtlas öffnen →

Verwandte Einträge