我正在尝试使用 pg_stat_statements 来优化我的查询,但遇到了意外的障碍。
SELECT total_plan_time + total_exec_time as total_time, query
FROM pg_stat_statements
ORDER BY total_time
DESC LIMIT 10;
结果是
ERROR: invalid byte sequence for encoding "UTF8": 0x00
我对此进行了调查,似乎 Postgres 不喜欢文本字段中的 NULL 字符 \00。
大多数关于此错误的现有在线建议都是针对看到将数据插入 Postgres 错误的人们。在这种情况下,修复似乎是在插入之前过滤空字符。
在这种情况下,数据似乎已经在 postgres 中,但它使视图无法查询。
a\d+ pg_stat_statements
告诉我 pg_stat_statements 视图是通过运行一个函数构建的,我试图使用 translate 和 replace 摆脱字符,但没有运气。
知道如何使用 NULL 字符找到有问题的查询吗?我假设长期修复是使用 NULL 字符跟踪查询,弄清楚它是如何进入的。
到目前为止我已经尝试过:
我通过执行
SELECT pg_stat_statements_reset();
. 上面的查询会在短时间内立即生效。我做了一个
\ef pg_stat_statements
,似乎第一个参数是一个名为 show text 的布尔值。传递 false 让我可以查询表,这让我可以这样做:
SELECT total_plan_time + total_exec_time as total_time, queryid
FROM pg_stat_statements(false)
ORDER BY total_time
DESC LIMIT 10;
不幸的是,queryid 不是很有用,除非我有办法在没有此错误的情况下检索映射的查询文本。
对如何进行的建议表示赞赏!我在 PostgreSQL 13.4