查询优化一般可以分为代数优化(也称逻辑优化)和物理优化(也称非代数优化)。
代数优化是指关系代数表达式的优化,物理优化是指通过存取路径和底层操作算法的选择进行的优化。
查询处理的步骤
查询处理分为4个阶段:查询分析、查询检查、查询优化、查询执行。
查询分析:对查询语句进行扫描、此法分析和语法分析。
查询检查:对合法的查询语句进行语义检查,检查通过后把SQL查询语句转换成内部表示,即等价的关系代数表达式。这个过程要把数据库对象的外部名称转换为内部表示,关系数据库管理系统一般都用查询树,也称语法分析树来表示扩展的关系代数表达式。
查询优化:选择一个高效执行的查询处理策略,优化层次一般分代数优化和物理优化。
查询执行:根据优化器得到的执行策略生成查询执行计划,由代码生成器生成执行这个查询计划的代码,然后加以执行,回送查询结果。
- 代数优化
指关系代数表达式的优化,即按照一定的规则,通过对关系代数表达式进行等价变换,改变代数表达式中操作的次序和组合,使查询执行更高效。
- 物理优化
指存取路径和底层操作算法的选择,选择的依据可以说基于规则的也可以说基于代价的,还可以基于语义的。
查询优化概述
查询优化的优点不仅在于用户不必考虑如何最好地表达查询以获得较高的效率,而且在于心态可以比用户程序的“优化”做的更好。
优化器可以根据数据字典中获取许多统计信息,优化器可以根据这些信息做出正确估算,选择高效的执行计划;
如果数据库的物理统计信息改变,系统可以自动对查询进行重新优化以选择相应的执行计划;
优化器可以考虑数百种不同的执行计划;
优化器中包括许多复杂的优化技术(在集中式数据库中,查询执行开心主要包括磁盘存取块数(I/O代价)、处理时间(CPU代价)以及查询的内存开销,在分布式数据库中还要加上通信代价,即总代价=I/O代价+CPU代价+内存代价+通信代价,由于磁盘I/O操作涉及机械动作,需要的时间与内存操作相比要高几个数量级,因此在计算查询代价一般用查询处理读写的块数作为衡量单位。)
关系代数表达式等价变换规则
代数优化策略是通过对关系代数表达式的等价变换来提高查询效率。
查询树的启发式优化
(1) 选择运算尽可能先做,因为选择运算一般使中间结果大大变小
(2) 把投影运算和选择运算同时进行,如有若干投影和选择运算,并且它们都是对同一个关系操作,则可以在扫描此关系的同时完成所有这些运算以避免重复扫描关系
(3) 把投影同其前或后的双目运算结合起来
(4) 把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算。
(5) 找出公共子表达式
物理优化
选择的方法可以是基于规则的启发式优化,基于代价估算的优化,两者结合的优化方法。
查询计划的执行
查询计划的执行可以分为自顶向下和自底向上两种执行方法。