Thread

  1. Re: Report index currently being vacuumed in pg_stat_progress_vacuum

    SATYANARAYANA NARLAPURAM <satyanarlapuram@gmail.com> — 2026-05-04T04:53:04Z

    Hi,
    
    On Sun, May 3, 2026 at 7:01 PM Bharath Rupireddy <
    bharath.rupireddyforpostgres@gmail.com> wrote:
    
    > Hi,
    >
    > When VACUUM is in the "vacuuming indexes" or "cleaning up indexes" phase,
    > there is currently no easy way to tell which specific index is being
    > processed. The progress report view shows indexes_total and
    > indexes_processed counters, but not which index is actively being worked on.
    >
    > This makes it difficult to debug slow or stuck autovacuum workers on
    > tables with multiple indexes of different types (btree, GIN, GiST, BRIN,
    > HNSW, etc.), since one cannot determine which index type or which specific
    > index is causing the delay.
    >
    > Please find the attached patch adds a new column current_index_relid to
    > pg_stat_progress_vacuum that reports the OID of the index currently being
    > vacuumed or cleaned up. The column is reported for both the "vacuuming
    > indexes" phase and the "cleaning up indexes" phase.
    >
    > When indexes are being vacuumed in parallel, each parallel worker emits
    > its own row in pg_stat_progress_vacuum with current_index_relid set to the
    > index it is currently processing, and leader_pid pointing to the leader
    > process.
    >
    > Appreciate any feedback. Thank you!
    >
    > [1] Example output:
    >
    >  pid  | datname  | relid | table_name |       phase       | started_by |
    > current_index_relid |  index_name   | leader_pid
    >
    > ------+----------+-------+------------+-------------------+------------+---------------------+---------------+------------
    >  1420 | postgres | 16395 | vac_test   | vacuuming indexes | autovacuum |
    >             16398 | vac_test_idx1 |
    >  1421 | postgres | 16395 | vac_test   | vacuuming indexes |            |
    >             16399 | vac_test_idx2 |       1420
    >  1423 | postgres | 16395 | vac_test   | vacuuming indexes |            |
    >             16400 | vac_test_idx3 |       1420
    > (3 rows)
    >
    >  pid  | datname  | relid | table_name |       phase       | started_by |
    > current_index_relid |  index_name   | leader_pid
    >
    > ------+----------+-------+------------+-------------------+------------+---------------------+---------------+------------
    >  1346 | postgres | 16395 | vac_test   | vacuuming indexes | manual     |
    >             16398 | vac_test_idx1 |
    > (1 row)
    >
    > [2]
    > SELECT v.pid, v.datname, v.relid, c.relname AS table_name,
    >        v.phase, v.started_by, v.current_index_relid,
    >        COALESCE(ic.relname, '') AS index_name, v.leader_pid
    > FROM pg_stat_progress_vacuum v
    > JOIN pg_class c
    >     ON c.oid = v.relid
    > LEFT JOIN pg_class ic
    >     ON ic.oid = v.current_index_relid
    > WHERE v.relid = $tbl_oid
    > ORDER BY
    >     v.leader_pid,
    >     v.pid;
    >
    
    Bharath, thanks for the patch! A few comments:
    
     (1) Do we need a global API? Can we add a leader_pid field in PVShared?
    
    +pid_t
    +GetParallelLeaderPid(void)
    +{
    + return ParallelLeaderPid;
    +}
    
    (2):  Looks like current_index_relid is not cleared when we leave the index
    phases.As a result, once any index has been processed,
    pg_stat_progress_vacuum.current_index_relid keeps reporting that relid
    through vacuuming heap, truncating heap, cleaning up indexes.
    This will be confusing to the user. Something like below:
    
    1795819|vacuuming heap|0/0|16392|t1_pkey|LEADER
    
    (3) leader_pid type should be integer type similar to pg_Stat_activity?
    
    Thanks,
    Satya