Tabellen mit veralteten Statistiken finden (ANALYZE-Strategie)
PostgreSQLWartungBefehl
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).