在pg_stat_statements中明确区分类似的查询?

时间:2018-10-11 19:33:55

标签: sql postgresql pg-stat-statements

pg_stat_statements非常(聪明)在规范化查询以汇总统计信息时非常聪明,无论您传递的参数如何。但是,我面临着这样一种情况,即从应用程序中的许多位置调用特定查询,并且我希望基于这些不同位置获取单独的统计信息。受Marginalia library的启发,我尝试附加SQL注释来注释查询。不幸的是,它不起作用。参见以下示例:

SELECT * FROM users WHERE email = 'a@b.c' /* action: signup */
SELECT * FROM users WHERE email = 'x@y.z' /* action: login */

发生的情况是pg_stat_statements存储查询的规范化表示形式以及它看到的第一个注释:

SELECT * FROM users WHERE email = $1 /* action: signup */

然后,如果我用不同的注释(或根本没有注释)调用同一查询,则统计信息将汇总到同一项目中。有效地从规范化查询表示中忽略注释。

有什么方法可以调用等效的SQL查询,但是可以通过pg_stat_statements分别跟踪它们吗?

2 个答案:

答案 0 :(得分:5)

我认为可以解决您的问题。这不是最好的解决方案,但也许对您有帮助。

您可以对位于不同地方的非常相似查询的 WHERE 子句添加更多限制,例如“true = true”到“trick” pg_stat_statements 并获得单独的统计信息(至少在 Postgresql 9.2 工作中)。

示例:

SELECT * FROM users WHERE email = 'a@b.c'
SELECT * FROM users WHERE email = 'x@y.z' AND true = true

pg_stat_statements 输出(“查询”字段):

SELECT * FROM users WHERE ? = ? 
SELECT * FROM users WHERE ? = ? AND ? = ?

答案 1 :(得分:0)

不,没有。

如果需要,并且语句的持续时间较长,则可以使用log_min_duration_statement并自己汇总持续时间。