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

Does executing a prepared statement skip the planning stage in PostgreSQL

我想知道我是否在 PostgreSQL 中准备了一条语句,即:

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

我执行的时候后端会不会调用parse分析和planner:

EXECUTE newquery(123);

我发现一些 documentation 说 PostgreSQL "skips" 解析准备查询的分析和计划,并通过这样做显着优化查询执行。

我尝试通过覆盖 post_parse_analyze_hookplanner_hook 来测试它,并从中简单地将一些内容写入日志文件(即 "Planner called"),这样我就可以查看计划器是否和解析分析器被调用。这种测试方法有效吗?

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

我这样做是因为我想计算一个查询被编译了多少次,以便更好地理解 "query caching"。

注意:我在单个会话中执行此操作。每次连接到服务器时,我都会重新准备语句。

为什么叫planner和parse analyzer?

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

尝试EXECUTE准备好的语句至少六次,看看是否仍然调用规划器。