9.1 关系数据库系统的查询处理
关系数据库管理系统查询处理可以分为4个阶段:查询分析、查询检查、查询优化和查询执行。
- 查询分析
对查询语句进行扫描、词法分析和语法分析。识别出语言符号,进行语法检查和语法分析,判断是否符合SQL语法规则。如果没有语法错误就转入下一步处理,否则便报告语句中出现的语法错误。 - 查询检查
- 对合法的查询语句进行语义检查,即根据数据字典中有关的模式定义检查语句中的数据库对象,如关系名、属性名是否存在和有效。
- 如果是对视图的操作,则要用视图消解方法把对视图的操作转化成对基本表的操作。
- 还要根据数据字典中的用户权限和完整性约束定义对用户的存取权限进行检查。如果该用户没有相应的访问权限或违反了完整性约束,就拒绝执行该查询。当然,这时的完整性检查是初步的、静态的检查。
- 检查通过后便把SQL查询语句转换成内部表示,即等价的关系代数表达式。
这个过程中要把数据库对象的外部名称转换为内部表示。关系数据库管理系统一般都用查询树(query tree),也称为语法分析树(syntax tree)来表示扩展的关系代数表达式。
- 查询优化
每个查询都会有许多可供选择的执行策略和操作算法,查询优化就是选择一个高效执行的查询处理策略。
查询优化按照优化的层次可以分为:
- 代数优化
是指关系代数表达式的优化,即按照一定的规则,通过对关系代数表达式进行等价变换,改变代数表达式中操作的次序和组合,是查询执行更高效; - 物理优化
是指存取路径和底层操作算法的选择。选择的依据可以是基于规则(rule based)的,也可以是基于代价(cost based)的,还可以是基于语义(semantic based)的。
实际关系数据库管理系统中的查询优化都综合运用了这些优化技术,以获得最好的查询优化效果。
- 查询执行
根据优化器得到的执行策略生成查询执行计划,由代码生成器*(code generator)生成执行这个查询计划的代码,然后加以执行,回送查询结果。
9.2 代数优化
9.2.1 关系代数表达式等价变换规则
代数优化策略是通过对关系代数表达式的等价变换来提高查询效率。
- 连接、笛卡尔积的交换律
- 连接、笛卡尔积的结合律
- 投影的串接定律
- 选择的串接定律
- 选择与投影操作的交换律
- 选择与笛卡尔积的交换律
- 选择与并的分配律
- 选择与差运算的分配律
- 选择对自然连接的分配律
- 投影与笛卡尔积的分配律
- 投影与并的分配律
9.2.2 查询树的启发式优化
1. 选择运算应尽可能先做。2. 把投影运算和选择运算同时进行。
3. 把投影同其前或后的双目运算结合起来。
4. 把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算。
5. 找出公共子表达式。