DBAtlas · Atlas d'exploitation des bases de données

Trouver les tables aux statistiques obsolètes (stratégie ANALYZE)

PostgreSQLMaintenance

Commande

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;

Ce que fait la commande

Affiche le nombre de lignes modifiées depuis le dernier ANALYZE, son rapport aux lignes vivantes, et le seuil approximatif de modifications auquel autovacuum déclenchera ANALYZE.

Quand l'utiliser

Après des chargements/suppressions en masse, lorsque les plans montrent des estimations de lignes erronées, ou lorsqu'on soupçonne autoanalyze de prendre du retard sur de grandes tables.

Attention

Le seuil calculé utilise les réglages globaux ; s'il existe des reloptions autovacuum_analyze_* propres à la table (pg_class.reloptions), le seuil réel diffère. Sur les grandes tables, le scale_factor par défaut (0.1) se déclenche bien trop tard ; abaissez-le par table. Autovacuum n'exécute pas ANALYZE sur le parent d'une table partitionnée ; les statistiques au niveau du parent nécessitent un ANALYZE manuel. Les tables temporaires ne sont jamais vues par autovacuum. ANALYZE lit un échantillon et prend un ShareUpdateExclusiveLock (ne bloque pas les DML).

Ouvrir dans DBAtlas →

Voir aussi