O PostgreSQL faz um cache por backend (por conexão, efetivamente) dos dados usados pelo
pg_stat_get_activity()
função usada por ambos pg_stat_activity
e pg_stat_replication
. Esse cache é limpo no commit/rollback, mas não no final de cada instrução dentro de uma transação em
READ COMMITTED
como de costume. Você pode limpar explicitamente com
SELECT pg_stat_clear_snapshot()
. Chame-o dentro do corpo de um LOOP
PL/PgSQL para atualizar. Não há como o AFAIK pedir ao PostgreSQL para atualizar automaticamente após cada instrução ao usar
repeatable read
ou maior isolamento. No código-fonte, veja
pgstat_read_current_status(void)
e pgstat_clear_snapshot(void)
.