据我所知
EXPLAIN (ANALYZE, ...)
不接受带参数查询:
EXPLAIN (ANALYZE) SELECT * FROM mytable WHERE name = $1
会产生错误:ERROR: there is no parameter $1 at character 107
所以我不能使用参数绑定
db.Query(myquery, params...)
。
如何使用我想要的任何参数安全地运行
EXPLAIN
命令?我需要获取一个可以清理 sql 字符串的包吗?我正在构建一个程序,通过接受用户输入自动解释查询。
您能做的最好的事情就是创建一份准备好的声明:
PREPARE stmt(text) AS SELECT * FROM mytable WHERE name = $1;
那么你可以
EXPLAIN EXECUTE stmt('some name');
无需在语句中插入字符串即可获取执行计划。如果您不想让准备好的语句存在直到数据库会话结束,您可以
DEALLOCATE
它。
如果不想考虑参数值,可以使用
EXPLAIN (GENERIC_PLAN) SELECT * FROM mytable WHERE name = $1;
这将为您提供通用计划,并且可从 PostgreSQL v16 开始使用。