由于 SQL 只是一种声明性的语言,因此 DBMS 需要决定如何执行 SQL 查询语句。
自上而下执行SELECT name FROM Person WHERE age<21;上层语言(SQL)π_name(σ_age<21(Person))下层语言(关系代数 RA)π_name
|
σ_age<21
|
Person
执行表(查询树) 查询结果在上述过程中,查询处理过程经历了一下步骤:
查询解析与转换(Parser and translator) 检查 SQL 查询语法验证关系表是否存在(表名、属性、数据类型、权限等)转化成关系代数表达式(分解成不同的查询块,再分别转化)查询优化(Query optimiser) 转化成可能为最优的执行表(对于同一个 SQL 查询,可能形成不同的执行表)在执行表中明确每一个操作符的实现评价机(Evaluation engine) 评价查询执行表返回结果给用户查询优化是关系型数据库管理系统中最重要的任务之一。一个好的 DBMS 必须拥有一个好的查询优化器。
每一个 RA 表达式都可以用查询树来表示,其中:
叶子节点 - 代表输入的关系表中间节点 - 代表中间结果根节点 - 代表最终结果的关系表而执行表就是在查询树的基础上,在每个节点的位置添加注解,用以说明每个表的访问方法以及每个 RA 运算符的实现方法
物化(Materialized):操作符的中间结果可以保存在临时表中,供下一个操作符处理流水线(Pipelined):操作符的中间结果直接发送给另一个操作符,而不需要创建临时表(也称为on-the-fly)
在实践中,查询优化器包含以下三种优化方法:
语义查询优化:使用应用程序特定的语义知识将查询转换为成本更低的查询基于规则的查询优化:使用启发式规则将关系代数表达式转换为具有可能更低成本的等价表达式。 思想:在其他操作之前应用最严格的操作,可以减少中间结果的大小下推选择(Push-down selection):尽早应用,减少元组的数量下推投影(Push-down projection):尽早应用以减少属性的数量。重新排序连接(Re-ordering joins):首先应用限制性连接来减少结果的大小。基于成本的查询优化:使用成本模型来估计计划的成本,然后选择最具成本效益的计划一个普遍的查询模式为 连接(join)- 选择(select)- 投影(project)。
