查询处理
- 用户提交 SQL 查询请求给数据库管理系统
- 数据库管理系统处理和执行 SQL 请求,从数据库中获取相应数据并返回。
由于 SQL 只是一种声明性的语言,因此 DBMS 需要决定如何执行 SQL 查询语句。
形态 | 类别 |
---|---|
SELECT name FROM Person WHERE age<21; | 上层语言(SQL) |
下层语言(关系代数 RA) | |
执行表(查询树) | |
查询结果 |
在上述过程中,查询处理过程经历了一下步骤:
- 查询解析与转换(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)。