执行预准备语句是否会跳过PostgreSQL中的计划阶段

时间:2017-04-03 10:34:47

标签: postgresql open-source prepare

我想知道我是否在PostgreSQL中准备一份声明,即:

PREPARE newquery(int) AS
SELECT * FROM table1 WHERE somefield > $1;

执行时,后端是否会调用解析分析和计划程序:

EXECUTE newquery(123);

我找到了一些documentation,其中说PostgreSQL“跳过”解析分析和规划准备好的查询,并通过这样做显着优化了查询执行。

我尝试通过覆盖post_parse_analyze_hookplanner_hook来测试这个,并从他们只是将一些东西写入日志文件(即“Planner called”),所以我可以看看是否有规划器和解析器叫做。这种测试方法有效吗?

我很困惑,因为每次执行EXECUTE newquery(some number);时,都会调用解析分析器和规划器。

我正在做这一切,因为我想计算编译查询的次数,以便更好地理解“查询缓存”。

注意:我在一个会话中这样做。每次我连接到服务器时,我都会再次准备语句。

为什么调用计划程序和解析分析器?

1 个答案:

答案 0 :(得分:3)

这必须是9.2中引入的“自定义计划”功能。 对于预准备语句的前几次执行,它将生成自定义计划,该计划使用参数值,然后切换到通用计划(不使用参数值)如果这些计划看起来不比通用计划好。

尝试EXECUTE准备好的陈述至少六次,看看是否仍然调用了规划师。