第十一章 查询处理
1. 查询处理概述
- 查询处理定义
- 从数据库中检索数据包含的活动
- 查询处理的目的是将高级语言(例如SQL)表示的查询转换为正确有效的、用低级语言(实现关系代数)表达的执行策略,并执行该策略以获取所需检索的数据
- 查询处理主要分为四个阶段
- 查询分解 --包括语法分析和正确性验证
- 查询优化
- 代码生成
- 执行
- 查询优化
- 为查询处理选择一个高效的执行策略
- 由于与一个高级查询等价的转换形式有多种,所以查询优化的目的就是选择其中资源占用最少的一种。
- 要尽力减少总的执行时间
- 减少查询的响应时间
- Note:在关系个数很多的情况下,找到最优解是非常困难的。通常采取的策略是,寻找一种近似最优解
2. 查询分解
- 目的:将高级查询转换为关系代数查询,并且分析语法和语义的正确性。
- 查询分解的阶段:
- 分析
- 规范化
- 语义分析
- 化简
- 查询重构
- 分析:
- 主要工作:
- 利用程序设计语言编译器的技术对查询进行词法分析和语法分析
- 负责验证查询中出现的关系和属性是否在系统目录中有定义
- 检查对数据库对象施加的运算是否与对象的类型相匹配
- 这一阶段的任务完成后,高级查询转换为更适合处理的内部表示。通常其内部表示形式为某种类型的查询树(关系代数树),构造方法如下:
- 为查询的每一个基础关系创建一个叶节点
- 为关系代数运算产生的每一个中间关系创建一个非叶节点
- 树的根节点代表查询结果
- 运算按照从叶到根的顺序执行
3.查询优化
- 两种主要查询优化技术
- 查询优化的启发式方法
- 根据相对成本比较不同的策略,并且选择一种最大限度地减少资源使用的策略
- 在实践中,这两种方法通常结合使用
4.关系代数运算的转换规则
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UFdj0Edt-1623296495105)(https://gitee.com/liuqi66/markdown-photo/raw/master/others/image-20210610111323578.png)]
5.启发式处理策略
- 尽可能早地执行选择运算
- 注意要将作用于同一关系地选择谓词放在一起
- 合并笛卡儿乘积与其后的选择运算为连接运算,用选择运算的谓词表示连接条件
- 利用二元运算的结合律对叶结点重新排序,先执行条件最严格的选择运算
- 尽可能早地执行投影运算
- 只计算一次公共表达式的值
6. 关系代数运算的代价估计
- DBMS可以有多种不同的方式来实现关系代数运算,查询优化的目的就是从中选择效率最高的那种方案。
- DBMS采用公式来估算不同方案的开销,然后选择其中开销最小的。
- 查询处理中占主导地位的开销通常是磁盘访问的开销,因此磁盘访问要比主存访问慢得多,所以在进行代价估算时,仅考虑磁盘访问的开销。
- 许多代价估算都是基于关系的基数的,所以需要能够估算关系的基数
- 估算关系代数运算中间结果的大小和开销时,正确与否的关键在于DBMS存储的统计信息的数量和即时性。
- 我们期望DBMS在系统目录中存储以下类型的信息:
- 关于基本关系R的统计信息
- nTuples®:关系R的元组的数目(R的基数)
- bFactors®:R的块因子(即一块可以存储的R元组的个数)
- nBlocks®:存储关系R所需的块数
- nBlocks = nTuples / bFactors
- 关于基本关系R的属性A
- nDistinct(A, R): 属性A在关系R中的不同取值的个数
- min(A,R); max(A,R) : 属性A在关系R中可能的最大值和最小值
- SC(A,R) : 属性A在关系R中的选择基数。这是满足属性A的某个等值条件的平均元组个数
- 关于属性集A上的多级索引 I
- nLevels(A,I) : I 的级数
- SC(A,R) : 属性A在关系R中的选择基数。这是满足属性A的某个等值条件的平均元组个数
- 关于属性集A上的多级索引 I
- nLevels(A,I) : I 的级数
- nLfBlocks(A,I) : I中叶的快数