版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lifestxx/article/details/84973838
数据库的架构,本书是查询优化模块 src/backend/optimizer
查询优化的优势(优化器对人):
信息不对称(内部更多:统计数据)
时效性(数据时刻在变,查询计划不是恒定的)
算力不同(人弱爆了)
查询优化分两个层次:基于规则的(RBO);基于代价的(CBO)
逻辑优化:等价变换;
物理优化:变成最优的查询执行器的语言
逻辑优化的可能性:
例子:笛卡尔积的带条件的查询
可以变为:条件下推到表的笛卡尔乘积。
关系表达式计算量降低:需要保存的中间结果减少,从而减少CPU与IO消耗。
可以从水平和垂直方向上尽早缩小笛卡尔积的中间结果:
尽量将选择操作下推到下层节点来做;
尽量在叶子节点使用投影缩小中间结果。
但:很多情况下简单处理会导致不等价!!
物理优化的可能性:
单个表有多个查询路径(全表扫,索引,快速索引,跳表等);多个表的连接顺序;多个连接路径。
工具:
B+树;Hash表;排序;物化
如此多的路径,如何搜索最优?
1 少的话就动态规划寻最优;
2 多的话用启发算法如遗传算法。
源码结构如上图。
plan总调度。prep预处理。path寻最优路径。