java 与Oracle不同,PostgreSQL中的解释计划在提供占位符时不会执行

qyyhg6bp  于 2023-02-18  发布在  Java
关注(0)|答案(2)|浏览(144)

Oracle示例

explain plan for select * from sample_table where column_name = :1

这将以表格形式返回包含详细步骤和开销的查询计划。

PostgreSQL上的示例

explain (format yaml) select * from sample_table where column_name = $1

这将最终返回一个要求提供参数的错误。

explain (format yaml) select * from sample_table where column_name = $$$$

这将最终返回时间戳和整数的错误

explain (format yaml) select * from sample_table where column_name = null

这将返回不完整的计划,没有过滤器信息,因为我们传递的是null。
注意:注意它可能正在查找实际参数。
任何人都可以请指导任何适当的值,可用于字符变化,文本,整数和时间戳,可以给予一个完整的计划?关键是,我们不能通过由于数据的问题,实际参数。

3gtaxfhh

3gtaxfhh1#

在PostgreSQL中获得一个通用计划并不容易,你可以通过设置plan_cache_mode = force_generic_plan,创建一个预准备语句,并在提供NULL值的同时调用EXPLAIN EXECUTE ...来实现。
您可以在my article中找到描述的过程。
我有PostgreSQL V16的submitted a patch,它将这个功能添加到了核心。如果你希望这样做,你可以查看这个补丁或者在邮件列表中表达你的兴趣。

5f0d552i

5f0d552i2#

如果使用预准备语句,则可以获取特定值的执行计划:

prepare pstmt(integer) 
as 
select * 
from sample_table 
where column_name = $1;

然后使用以下公式获取特定值的计划:

explain (analyze, buffers) 
execute pstmt(42);

相关问题