Skip to content

Commit 131b35e

Browse files
updating pg_stat_statements version specific.
Fine tuned collector query to eliminate the duplicates on queryid and optimized for best performance. tested with below versions: PostgreSQL -12 PostgreSQL - 13 PostgreSQL -14 PostgreSQL -16 Two query sets: Version less than 13 Version equal and greater than 13 Signed-off-by: VigneshViggu <[email protected]>
1 parent b126e62 commit 131b35e

File tree

1 file changed

+38
-40
lines changed

1 file changed

+38
-40
lines changed

collector/pg_stat_statements.go

Lines changed: 38 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -71,47 +71,45 @@ var (
7171
prometheus.Labels{},
7272
)
7373

74-
pgStatStatementsQuery = `SELECT
75-
pg_get_userbyid(userid) as user,
76-
pg_database.datname,
77-
pg_stat_statements.queryid,
78-
pg_stat_statements.calls as calls_total,
79-
pg_stat_statements.total_time / 1000.0 as seconds_total,
80-
pg_stat_statements.rows as rows_total,
81-
pg_stat_statements.blk_read_time / 1000.0 as block_read_seconds_total,
82-
pg_stat_statements.blk_write_time / 1000.0 as block_write_seconds_total
83-
FROM pg_stat_statements
84-
JOIN pg_database
85-
ON pg_database.oid = pg_stat_statements.dbid
86-
WHERE
87-
total_time > (
88-
SELECT percentile_cont(0.1)
89-
WITHIN GROUP (ORDER BY total_time)
90-
FROM pg_stat_statements
74+
// Query is compatible for versions lesser than PostgreSQL 13.
75+
pgStatStatementsQuery = `WITH percentiles AS (
76+
SELECT percentile_cont(0.1) WITHIN GROUP (ORDER BY total_time) AS percentile
77+
FROM pg_stat_statements
9178
)
92-
ORDER BY seconds_total DESC
93-
LIMIT 100;`
94-
95-
pgStatStatementsNewQuery = `SELECT
96-
pg_get_userbyid(userid) as user,
97-
pg_database.datname,
98-
pg_stat_statements.queryid,
99-
pg_stat_statements.calls as calls_total,
100-
pg_stat_statements.total_exec_time / 1000.0 as seconds_total,
101-
pg_stat_statements.rows as rows_total,
102-
pg_stat_statements.blk_read_time / 1000.0 as block_read_seconds_total,
103-
pg_stat_statements.blk_write_time / 1000.0 as block_write_seconds_total
104-
FROM pg_stat_statements
105-
JOIN pg_database
106-
ON pg_database.oid = pg_stat_statements.dbid
107-
WHERE
108-
total_exec_time > (
109-
SELECT percentile_cont(0.1)
110-
WITHIN GROUP (ORDER BY total_exec_time)
111-
FROM pg_stat_statements
112-
)
113-
ORDER BY seconds_total DESC
114-
LIMIT 100;`
79+
SELECT DISTINCT ON (pss.queryid)
80+
pg_get_userbyid(pss.userid) as user,
81+
pg_database.datname,
82+
pss.queryid,
83+
pss.calls as calls_total,
84+
pss.total_time / 1000.0 as seconds_total,
85+
pss.rows as rows_total,
86+
pss.blk_read_time / 1000.0 as block_read_seconds_total,
87+
pss.blk_write_time / 1000.0 as block_write_seconds_total
88+
FROM pg_stat_statements pss
89+
JOIN pg_database ON pg_database.oid = pss.dbid
90+
CROSS JOIN percentiles
91+
WHERE pss.total_time > (SELECT percentile FROM percentiles)
92+
ORDER BY pss.queryid, pss.userid DESC
93+
LIMIT 100;`
94+
95+
// Query is compatible from PostgreSQL 13 and higher versions.
96+
pgStatStatementsNewQuery = `SELECT DISTINCT ON (pss.queryid)
97+
pg_get_userbyid(pss.userid) as user,
98+
pg_database.datname,
99+
pss.queryid,
100+
pss.calls as calls_total,
101+
pss.total_exec_time / 1000.0 as seconds_total,
102+
pss.rows as rows_total,
103+
pss.blk_read_time / 1000.0 as block_read_seconds_total,
104+
pss.blk_write_time / 1000.0 as block_write_seconds_total
105+
FROM pg_stat_statements pss
106+
JOIN pg_database ON pg_database.oid = pss.dbid
107+
JOIN (
108+
SELECT percentile_cont(0.1) WITHIN GROUP (ORDER BY total_exec_time) AS percentile_val
109+
FROM pg_stat_statements
110+
) AS perc ON pss.total_exec_time > perc.percentile_val
111+
ORDER BY pss.queryid, pss.userid DESC
112+
LIMIT 100;`
115113
)
116114

117115
func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance, ch chan<- prometheus.Metric) error {

0 commit comments

Comments
 (0)