Hi, This is a proposal of a patch for pg_stat_statements extension. It corrects deallocation events accounting.
Since 2e0fedf there is a view pg_stat_statements_info is available in pg_stat_statements extension. It has a dealloc field, that should be a counter of deallocation events happened. Right now it accounts only automatic deallocation events, happened when we need a place for a new statement, but manual deallocation events caused by pg_stat_statements_reset() function for some subset of collected statements is not accounted. My opinion is that manual deallocation is a deallocation too and it must be accounted in dealloc field of pg_stat_statements_info view. Let's see how it happens: postgres=# select pg_stat_statements_reset(); postgres=# select 1; ?column? ---------- 1 (1 row) postgres=# select dealloc from pg_stat_statements_info ; dealloc --------- 0 (1 row) postgres=# select pg_stat_statements_reset(userid,dbid,queryid) postgres-# from pg_stat_statements where query = 'select $1'; pg_stat_statements_reset -------------------------- (1 row) postgres=# select dealloc from pg_stat_statements_info ; dealloc --------- 0 -- Here must be a one now, as deallocation happened (1 row) This patch adds accounting of manual deallocation events. -- Andrei Zubkov Postgres Professional The Russian Postgres Company
diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index 62cccbfa44..184e5c08ea 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -2579,7 +2579,18 @@ entry_reset(Oid userid, Oid dbid, uint64 queryid) /* All entries are removed? */ if (num_entries != num_remove) + { + if (num_remove) + { + /* Increment the number of times entries are deallocated */ + volatile pgssSharedState *s = (volatile pgssSharedState *) pgss; + + SpinLockAcquire(&s->mutex); + s->stats.dealloc += 1; + SpinLockRelease(&s->mutex); + } goto release_lock; + } /* * Reset global statistics for pg_stat_statements since all entries are