PostgreSQL 19 preview - planner Hook扩展
PostgreSQL 19 preview - planner Hook扩展
PostgreSQL 19连发了3个和planner hook关联的patch, 它们在为未来做什么准备呢?
1、 https://github.com/postgres/postgres/commit/c83ac02ec7309edb7561eee93895c31a54b93d3d 2、 https://github.com/postgres/postgres/commit/94f3ad3961a2cb32d30c79f01a70db4caff13318 3、 https://github.com/postgres/postgres/commit/4685977cc51c91dda0f76b1ef71ba02823a57a1e
Add ExplainState argument to pg_plan_query() and planner().
This allows extensions to have access to any data they've stored
in the ExplainState during planning. Unfortunately, it won't help
with EXPLAIN EXECUTE is used, but since that case is less common,
this still seems like an improvement. Since planner() has quite a few arguments now, also add some
documentation of those arguments and the return value.
Author: Robert Haas <[email protected]>
Co-authored-by: Tom Lane <[email protected]>
Reviewed-by: Andrei Lepikhov <[email protected]>
Reviewed-by: Tom Lane <[email protected]>
---
Add planner_setup_hook and planner_shutdown_hook.
These hooks allow plugins to get control at the earliest point at
which the PlannerGlobal object is fully initialized, and then just
before it gets destroyed. This is useful in combination with the
extendable plan state facilities (see extendplan.h) and perhaps for
other purposes as well.
Reviewed-by: Andrei Lepikhov <[email protected]>
Reviewed-by: Tom Lane <[email protected]>
---
Add extension_state member to PlannedStmt.
Extensions can stash data computed at plan time into this list using
planner_shutdown_hook (or perhaps other mechanisms) and then access
it from any code that has access to the PlannedStmt (such as explain
hooks), allowing for extensible debugging and instrumentation of
plans.
Reviewed-by: Andrei Lepikhov <[email protected]>
Reviewed-by: Tom Lane <[email protected]>
且看AI解读:
这三个 patch 明显是在 PostgreSQL 的查询规划器(planner)架构里,引入了新的扩展点(Hook)和机制,为未来的功能扩展做准备。下面详细解读每个 patch 及它们的关联性和潜在目标:
1. Add ExplainState argument to pg_plan_query() and planner()
主要变更:
在 pg_plan_query()和planner()函数中新增了ExplainState参数。这样,扩展(extension)可以在计划生成阶段访问并操作 EXPLAIN 相关数据。 补充了 planner() 的参数和返回值的文档说明。
意义:
使扩展开发者能在查询计划生成时,访问并存储和 EXPLAIN 相关的自定义数据,便于扩展 EXPLAIN 输出。 尤其有助于性能分析、调试、定制化的计划生成逻辑。 虽然 EXPLAIN EXECUTE 的场景还不完全覆盖,但这已经是非常重要的一步。
2. Add planner_setup_hook and planner_shutdown_hook
主要变更:
新增了 planner_setup_hook和planner_shutdown_hook两个钩子(hook)。允许插件在 PlannerGlobal 初始化完成后、销毁前获得控制权。 结合 extendplan.h 的机制,可以在 planner 生命周期的最早和最后阶段插入自定义逻辑。
意义:
极大增强了 planner 扩展点,插件可以在计划器关键阶段做初始化或清理操作。 为后续扩展计划状态(plan state)、定制 planner 逻辑、存储自定义信息等提供了基础。 便于更复杂的插件或扩展在 planner 生命周期内管理自己的资源或状态。
3. Add extension_state member to PlannedStmt
主要变更:
在 PlannedStmt结构体中增加了extension_state成员(一个 list)。扩展可以通过 planner_shutdown_hook等机制,把在计划阶段生成的数据存入该 list。任何有 PlannedStmt访问权的代码(比如 EXPLAIN hook)都可以访问这些扩展数据。
意义:
提供了一个官方的、可扩展的数据存储点,便于插件在计划阶段存储和传递自定义信息。 有利于计划器(planner)的调试、性能分析、运行时监控等复杂功能的开发。 允许未来的插件和扩展更深入地参与计划生成和执行过程。
这些 patch 可能是为哪些未来功能做准备?
1. 增强扩展能力和二次开发支持
这些变更显著提升了 PostgreSQL 在查询计划器阶段的可扩展性,为第三方插件、定制化功能、性能分析工具等提供了更丰富的扩展点。 开发者可以更方便地插入自定义逻辑、保存和传递自定义数据,为企业级、云原生、数据分析等场景提供支持。
2. 更细粒度的计划器调试和可观测性
通过 extension_state,未来有望实现更细致的计划器调试、性能分析、日志记录,甚至是计划器内部的数据追踪与可视化。 EXPLAIN 的输出可被插件进一步丰富,支持更多自定义的调试和分析信息。
3. 为新型执行器和自定义优化器铺路
随着云原生和 AI 时代的到来,数据库需要支持更多类型的优化和执行逻辑。 这些扩展点可以让未来的自定义优化器、分布式 planner、智能调度器更好地与 PostgreSQL 内核集成。
4. 提高代码可维护性和架构灵活性
通过 hook 和扩展点,不仅支持新功能,也让原有代码更容易维护和演进。 插件化和模块化的 planner 设计,将极大提升 PostgreSQL 的未来创新能力。
总结
这三组 patch 是 PostgreSQL 查询计划器架构的一次重要扩展,主要为增强扩展性、支持插件化调试和分析、便于未来功能创新做准备。
未来可能见到的功能包括:更强大的 EXPLAIN 输出、性能分析工具、定制化优化器、云原生扩展、智能调度插件等。