关系查询优化
- 代数优化
- 规则
- 交换律
- ,其中 只使用 中的属性。
- ,其中 只使用 中的属性。
- ,其中 只分别使用 中的属性。
- ,其中 只使用 中的属性。
- 结合律
- 分配律
- ,其中 只使用 中的公共属性。
- ,其中 是 的属性, 是 的属性。
- 串接律
- ,其中 。
- 交换律
- 策略
- 尽量早进行选择运算:减小中间关系的大小。
- 投影和选择同时进行:避免重复扫描。
- 投影和双目运算结合:减少关系的大小,进而减少重复扫描。
- 尽量把笛卡尔积转换为连接。
- 缓存公共子表达式。
- 算法
- 输入:查询的关系表达式树。
- 优化步骤:
- 拆分选择条件。
- 将选择运算向叶结点移动。
- 将投影运算向叶结点移动。
- 把多个选择和投影的串接合并为一次选择和一次投影串接。
- 对结点分组,一元运算和部分二元运算的结点的连通块组成一个组,一个组内操作一起完成。
- 符合条件的二元运算包括并、交、差、等值连接、笛卡尔积结合等值选择。
- 其他笛卡尔积的组不能包括其子结点。
- 数据库的查询执行按照优化的表达式树,以组为单位进行计算。
- 规则
- 基于存取路径的优化
- 选择
- 如果是小关系:优先全表扫描。
- 如果是大关系:
- 如果选择条件是主键相等性:使用主键索引。
- 如果选择条件是单个非主属性且有索引:
- 如果估计结果比例较小:使用索引。
- 否则使用全表扫描。
- 如果选择条件是合取条件:
- 如果有组合索引:使用组合索引
- 如果部分属性有索引:用部分索引筛选再判断其他条件
- 否则用全表扫描。
- 如果选择条件是析取条件:使用全表扫描。
- 连接
- 如果两个表都按连接属性排序:用排序合并法。
- 如果一个表的连接属性有索引:用索引连接法。
- 如果其中一个表较小:用哈希连接法。
- 否则使用嵌套循环法,并选择占用内存储存块更小的表为外表。
- 选择
- 基于代价估算的优化