明确区分 pg_stat_statements 中的相似查询?
Explicitly distinguish similar queries in 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 = /* action: signup */
然后,如果我用不同的评论(或根本没有评论)调用同一个查询,统计信息将聚合到同一个项目中。从规范化查询表示中有效地忽略了注释。
有没有什么方法可以调用等效的 SQL 查询,但让 pg_stat_statements 单独跟踪它们?
没有,没有。
如果您需要,并且语句持续时间较长,您可以使用 log_min_duration_statement
并自行汇总持续时间。
我认为有可能解决您的问题。这不是最好的解决方案,但也许对您有所帮助。
您可以对位于不同位置的非常相似的查询的 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 ? = ?
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 = /* action: signup */
然后,如果我用不同的评论(或根本没有评论)调用同一个查询,统计信息将聚合到同一个项目中。从规范化查询表示中有效地忽略了注释。
有没有什么方法可以调用等效的 SQL 查询,但让 pg_stat_statements 单独跟踪它们?
没有,没有。
如果您需要,并且语句持续时间较长,您可以使用 log_min_duration_statement
并自行汇总持续时间。
我认为有可能解决您的问题。这不是最好的解决方案,但也许对您有所帮助。
您可以对位于不同位置的非常相似的查询的 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 ? = ?