postgresql 显式区分pg_stat_statements中的相似查询?

pxy2qtax  于 2022-12-18  发布在  PostgreSQL
关注(0)|答案(3)|浏览(126)

pg_stat_statements为(谢天谢地)在规范化查询以聚合统计数据方面相当聪明,而不管您传递的参数是什么。但是,我面临着这样一种情况,即从应用程序中的许多位置调用特定查询,我希望基于这些不同的位置获得单独的统计数据。我尝试附加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单独跟踪它们?

vsaztqbk

vsaztqbk1#

我想一个可能解决你问题的办法。这不是最好的办法,但也许对你有帮助。
您可以对位于不同位置的非常相似的查询的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 ? = ?
5lhxktic

5lhxktic2#

不,没有。
如果需要,并且语句的持续时间很长,则可以使用log_min_duration_statement并自己聚合持续时间。

7qhs6swi

7qhs6swi3#

我终于找到了一个优雅而通用的解决方案,你可以通过在前面添加一个虚拟的Common Table ExpressionWITH子句)来标记你的查询:

WITH signup AS (SELECT 1) SELECT * FROM users WHERE email = 'a@b.c'
WITH login AS (SELECT 1) SELECT * FROM users WHERE email = 'x@y.z'

这些将单独跟踪,其名称保留在pg_stat_statements中:

WITH signup AS (SELECT $1) SELECT * FROM users WHERE email = $2
WITH login AS (SELECT $1) SELECT * FROM users WHERE email = $2

与@nachospiu的答案相比,另一个优势是它可以处理INSERTUPDATEDELETE以及SELECT查询,这些查询没有可以添加伪条件的WHERE
缺点是使用ORM可能不容易实现。

相关问题