DBAtlas · Atlas de operações de banco de dados

Acompanhar o progresso de operações autovacuum/VACUUM em execução

PostgreSQLManutenção

Comando

SELECT p.pid,
       a.backend_type,
       p.datname,
       p.relid::regclass AS table_name,
       p.phase,
       pg_size_pretty(p.heap_blks_total * current_setting('block_size')::bigint) AS table_size,
       round(100.0 * p.heap_blks_scanned / NULLIF(p.heap_blks_total, 0), 1) AS scanned_pct,
       round(100.0 * p.heap_blks_vacuumed / NULLIF(p.heap_blks_total, 0), 1) AS vacuumed_pct,
       p.index_vacuum_count,
       now() - a.xact_start AS running_for,
       a.wait_event_type || ':' || a.wait_event AS wait,
       left(a.query, 80) AS query
FROM pg_stat_progress_vacuum p
JOIN pg_stat_activity a USING (pid)
ORDER BY running_for DESC;

-- Busy autovacuum workers / upper limit
SELECT count(*) FILTER (WHERE backend_type = 'autovacuum worker') AS av_workers_busy,
       current_setting('autovacuum_max_workers') AS av_max_workers
FROM pg_stat_activity;

O que faz

Mostra, para cada VACUUM em execução (worker do autovacuum ou manual), a tabela, a fase, o percentual do heap varrido/limpo, o número de passagens de vacuum de índices e o wait event; além do número de workers do autovacuum ocupados.

Quando usar

Para estimar quando um VACUUM em uma tabela grande vai terminar, se todos os workers do autovacuum estão ocupados (tabelas esperando na fila) e se o vacuum está esperando por causa de throttling.

Atenção

index_vacuum_count > 1 significa que a lista de dead tuples não coube na memória e os índices foram varridos várias vezes; aumente maintenance_work_mem/autovacuum_work_mem (antes do PG17 no máximo 1GB é usado para isso). wait = Timeout:VacuumDelay é throttling baseado em custo (autovacuum_vacuum_cost_delay/cost_limit). Não encerre um autovacuum cujo texto de consulta diga 'to prevent wraparound'; ele reinicia imediatamente. VACUUM FULL e CLUSTER aparecem em pg_stat_progress_cluster, não nesta view.

Abrir no DBAtlas →

Relacionados