@@ -71,47 +71,45 @@ var (
71
71
prometheus.Labels {},
72
72
)
73
73
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
91
78
)
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;`
115
113
)
116
114
117
115
func (PGStatStatementsCollector ) Update (ctx context.Context , instance * instance , ch chan <- prometheus.Metric ) error {
0 commit comments