内容提要
本文介绍了PostgreSQL查询处理的不同阶段,重点讲解了执行器部分,它负责与其他内部模块通信,处理大多数DML查询类型。文章还提到了处理工具部分,共同构成了PostgreSQL数据库的核心。
延伸解读
Portal 的双路径设计
文章指出,PostgreSQL 源码中执行阶段实际封装在 Portal 对象内,并分为执行器路径和过程工具路径。执行器路径处理 SELECT、INSERT、UPDATE、DELETE 等 DML 查询,依赖规划器生成的计划;过程工具路径则处理 DDL 及 VACUUM、CREATE、PREPARE 等非 DML 查询,不依赖计划。这种设计让 Portal 能统一调度两类差异较大的请求。
执行器如何转化计划
执行器路径的核心函数是 ExecInitNode 和 ExecProcNode。ExecInitNode 将规划器生成的计划树转化为执行器可理解的数据结构,形成主节点与多个子节点的树状结构。例如并行顺序扫描中,主节点类型为 gather,子节点为 seqScan,gather 负责收集所有子节点的元组数据。此外,PortalRun 期间会创建快照,用于计算元组可见性。
过程工具的分发逻辑
过程工具路径相对简单,它不创建基于计划的执行节点,而是根据请求的 nodeTag 调用相应模块的函数。文章举例:TRANS_STMT_BEGIN 访问事务管理器,T_CreateTableSpaceStmt 访问表空间管理器,T_TruncateStmt 访问表访问方法,T_CreateRoleStmt 访问用户管理器。这种按 nodeTag 分发的机制使过程工具能灵活处理各类非 DML 操作。
对扩展开发的启示
文章总结,执行器和过程工具共同构成 PostgreSQL 的核心,几乎所有查询类型都由它们处理。它们本身不完成所有工作,而是将任务传递给正确的模块。因此,如果引入新的自定义模块,很可能需要同时修改执行器或过程工具,以确保新模块能被正确调用。这为理解 PostgreSQL 内部协作和扩展开发提供了重要视角。
Q&A
PostgreSQL的查询处理阶段有哪些?
PostgreSQL的查询处理阶段包括解析、分析、重写、计划和执行。
执行器在PostgreSQL中有什么作用?
执行器负责与其他内部模块通信,处理大多数DML查询类型,如SELECT、INSERT、UPDATE和DELETE。
什么是PostgreSQL中的门户(portal)?
门户是一个封装了执行器和过程工具的对象,负责处理查询的执行和非DML查询。
执行器路径和过程工具路径有什么区别?
执行器路径处理由规划器创建的计划,而过程工具路径处理不依赖于规划器的DDL和其他非DML查询。
exec_simple_query()函数的作用是什么?
exec_simple_query()函数是查询处理的起点,负责启动查询处理的各个阶段。
执行器如何与表和索引访问方法交互?
执行器通过与表和索引访问方法交互,最终访问磁盘进行数据操作。