Postgres 技术内幕,Optimizer过程分析
1. 逻辑优化
1. 子查询提升
- exist 相关子链接会被提升,非相关子链接不会进行优化, 但是会生成 initplan,只需要执行一次
- any 相关子查询不会提升,非相关子查询才能进行优化,实际上any的非相关子查询隐含一个外部引用的条件, 实际上还是相关子查询
- 如果是 join 条件中的子链接,则需要遵守 “any 的 左边需要是对应链接类型中不含输出的那一边”, 例如 left join 要求 any 的 左边只能是关联右边的属性,因为如果是左边,提升之后左边现在有约束条件,可能不会全部输出
- 子链接存在复杂表达式不支持提升,如cte,聚合操作等
- 子查询类似
2. 表达式优化
- 常量折叠
- 谓词规范 1. 简化 2. 约束条件拉平 3. 提取公共项
3. group 杂项消除
如果group 中包含 主键,则可以直接消除其他
4. 外连接消除
- 可空测有条件约束绝对不为空,则外连接可转换为内连接
Read other posts