规划器/优化器的核心职责是为给定的查询树制定全局综合物理代价最低的最优执行计划。同一条逻辑 SQL 查询在底层可以存在数十种乃至成千上万种不同的物理执行方式(不同的单表扫描算子、不同的多表关联拓扑顺序以及不同的连接算法),它们产出的数据逻辑结果集完全等价,但实际执行耗时可能相差数个数量级。优化器在计算资源允许的前提下,穷举评估各候选方案并选出预估最快的物理计划。
当多表关联数量极多时(例如涉及 10 张以上大表连接),穷举所有可能的连接顺序排列组合会导致优化器在规划阶段消耗无法承受的天文数字般的 CPU 耗时与内存。为此,当参与连接的表数量突破配置阈值 geqo_threshold 时,PostgreSQL 会智能切换为启发式的遗传算法查询优化器(GEQO,参见 Chapter 61),在毫秒级时间内收敛推导出合理的准最优执行计划。
优化器首先为查询中涉及的每张独立关系表生成单表扫描计划:包括全表顺序扫描(Seq Scan)、B 树索引扫描(Index Scan)、位图索引扫描(Bitmap Scan)等。随后评估多表连接策略:
嵌套循环连接(Nested Loop Join):针对外层(左侧)关系的每一行,循环遍历内层(右侧)关系。当内侧关系能够走高选择度索引查找时,该策略性能极佳。
归并连接(Merge Join):在连接开始前,先确保参与连接的两张表已严格按照连接键物理排好序。随后以双指针并行单趟同步推进扫描,扫描开销极低。
哈希连接(Hash Join):先全量扫描右表并在内存中按照连接键构建内存哈希表;随后流式扫描左表,逐行计算哈希键并在内存哈希表中高速探针匹配。
优化器结合表统计信息评估各算子代价,将最优路径组装为包含扫描节点、连接节点、排序节点及聚合计算节点的物理计划树。