执行准备好的语句是否跳过 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_hook
和 planner_hook
来测试它,并从中简单地将一些内容写入日志文件(即 "Planner called"),这样我就可以查看计划器是否和解析分析器被调用。这种测试方法有效吗?
我很困惑,因为每次我执行 EXECUTE newquery(some number);
解析分析器和规划器都会被调用。
我这样做是因为我想计算一个查询被编译了多少次,以便更好地理解 "query caching"。
注意:我在单个会话中执行此操作。每次连接到服务器时,我都会重新准备语句。
为什么叫planner和parse analyzer?
这一定是9.2引入的“自定义套餐”功能。
对于准备好的语句的前几次执行,它将生成一个使用参数值的 自定义计划 ,然后切换到 通用计划 (这确实不使用参数值)如果这些计划看起来不如通用计划。
尝试EXECUTE
准备好的语句至少六次,看看是否仍然调用规划器。
我想知道我是否在 PostgreSQL 中准备了一条语句,即:
PREPARE newquery(int) AS
SELECT * FROM table1 WHERE somefield > ;
我执行的时候后端会不会调用parse分析和planner:
EXECUTE newquery(123);
我发现一些 documentation 说 PostgreSQL "skips" 解析准备查询的分析和计划,并通过这样做显着优化查询执行。
我尝试通过覆盖 post_parse_analyze_hook
和 planner_hook
来测试它,并从中简单地将一些内容写入日志文件(即 "Planner called"),这样我就可以查看计划器是否和解析分析器被调用。这种测试方法有效吗?
我很困惑,因为每次我执行 EXECUTE newquery(some number);
解析分析器和规划器都会被调用。
我这样做是因为我想计算一个查询被编译了多少次,以便更好地理解 "query caching"。
注意:我在单个会话中执行此操作。每次连接到服务器时,我都会重新准备语句。
为什么叫planner和parse analyzer?
这一定是9.2引入的“自定义套餐”功能。 对于准备好的语句的前几次执行,它将生成一个使用参数值的 自定义计划 ,然后切换到 通用计划 (这确实不使用参数值)如果这些计划看起来不如通用计划。
尝试EXECUTE
准备好的语句至少六次,看看是否仍然调用规划器。