第4章 查询处理及优化
- 用户提交的SQL语句由DBMS的查询处理子系统经过一系列的分析和优化工作后生成查询执行计划,再经过存储子系统读写数据库中的数据,完成SQL语句规定的功能
- 查询处理和查询优化是DBMS的主要任务之一,也是DBMS的核心技术
1. 查询处理的步骤
- 查询分析
- 对查询语句进行词法分析和语法分析,检查用户提交的SQL语句是否符合SQL语法
- 查询检查
- 根据数据字典中的元数据,检查语句引用的数据库对象:表、列、存储过程、函数等是否存在和有效,还要检查用户是否拥有执行SQL语句的权限。检查完毕后,把SQL查询转换成等价的关系代数表达式
- 查询优化
- 从多个可供选择的执行策略和算法中选择一个执行效率高的作为查询执行计划,查询优化有逻辑优化和物理优化两个层次。逻辑优化是指根据关系代数运算的性质进行等价变换,使执行更高效。物理优化是指选择存取路径和实现关系代数运算的具体算法,一般采用基于代价的方法进行选择
- 查询执行
- 根据查询优化的结果生成代码并执行
2. 实现关系运算的算法
- 不同DBMS使用不同的物理存储结构存放关系
- DBMS一般向操作系统申请若干个文件,把这些文件占用的磁盘空间作为一个整体进行段页式管理
- 一个页面又叫作一块(Block),块是DBMS的I/O单位,块用于存储元组
- 使用B(R)表示关系R占用的块数,使用T(R)表示关系R占用的元组的数目,使用V(R,A)表示关系R在属性A上不同值的数量
- 在评估查询处理算法时,一般用算法读写的I/O块数作为衡量单位
2.1 外部排序
- 一个典型的外部排序算法分为内部排序阶段和归并阶段。其核心思想是根据内存的大小,将存放在磁盘上待排序的关系从逻辑上划分为若干个段(Run),一个段的大小以可以使用的内存大小为上限。在内部排序阶段,从磁盘上把一个段的全部元组读入内存,使用我们熟悉的内部排序算法,如快速排序,将这些元组排序,然后把它们写到磁盘临时存放。处理完所有的段后,进入多路归并阶段。经过1趟或2趟归并排序后,就完成了对关系的排序
- 如果可用内存为M块,则外部排序的I/O次数大约为:
\(2B(R)log_{M-1}B(R)\)
2.2 集合运算算法
- SQL的集合有两种语义,即传统的集合语义和包语义,包允许出现重复的元素
2.3 选择运算算法
- 选择运算只涉及一个关系,一般采用全表扫描或者基于索引的算法
2.3.1 全表扫描运算算法
- 全表扫描算法只需要很少的内存(最少为1块)就可以运行,而且控制简单,I/O次数为B(R)
2.3.2 基于索引的算法
- 索引一般采用B+树,I/O次数最少是树的深度
2.4 连接运算算法
2.4.1 嵌套循环连接算法
- 每读S的一个块到内存,就依次读R的所有块到内存,算法的I/O次数为$ B(S) + B(S)*B(R)$

- 基于索引的连接算法要优于简单嵌套循环算法
2.4.2 排序归并连接算法
- 排序归并连接算法的思想是先将关系R和关系S按照连接属性排序,然后使用归并两个有序线性表的归并算法实现两个关系的连接操作
3. 查询优化
3.1 查询优化概述
-
查询优化在关系数据库管理系统(RDBMS)中有非常重要的地位
-
目前的RDBMS大都采用基于代价的优化算法,通过某种代价模型计算出各种查询执行策略的执行代价,然后选取代价最小的执行方案
-
在集中式数据库中,查询的执行开销主要包括:总代价 = I/O代价 + CPU代价
-
多用户数据库代价:查询的执行开销主要包括:总代价 = I/O代价 + CPU代价 + 内存代价
-
查询优化的总目标
选择有效的策略,求得给定关系表达式的值,使得查询代价最小(实际上是较小)
3.2 查询优化的优点(重要性)
- 用户查询优化使影响RDBMS性能的关键因素,它减轻了用户选择存取路径的负担
- 用户不必考虑如何最好地表达查询以获得较好的效率
- 系统可以比用户程序的“优化”做得更好
3.3 查询优化的可能性
- 优化器可以从数据字典中获取许多统计信息,而用户程序则难以获得这些信息。
- 如果数据库的物理统计信息改变了,系统可以自动对查询重新优化以选择相适应的执行计划。在非关系系统中必须重写程序,而重写程序在实际应用中往往是不太可能的。
- 优化器可以考虑数百种不同的执行计划,程序员一般只能考虑有限的几种可能性。
- 优化器中包括了很多复杂的优化技术,这些优化技术往往只有最好的程序员才能掌握。系统的自动优化相当于使得所有人都拥有这些优化技术。
3.4 查询优化实例
-
一个关系查询可以对应不同的执行方案,其效率可能相差非常大。


-
第一种情况
Q1=πSname(σStudent.Sno=SC.Sno∧SC.Cno=‘1024' (Student×SC))

(2)作选择操作- 依次读入连接后的元组,按照选择条件选取满足要求的记录
- 假定内存处理时间忽略。读取中间文件花费的时间(同写中间文件一样)需读入106块,用时5x104秒。
- 若满足条件的元组假设仅50个,均可放在内存。
(3)作投影操作 - 把第(2)步的结果在Sname上作投影输出,得到最终结果
- 第一种情况下执行查询的总读写数据块=2100 + 10^6 + 10^6
- 总时间约为:105 + 2 x 5 x 10^4 ≈ 10^5秒
-
第二种情况


-
第三种情况


-
有选择和连接操作时,先做选择操作,这样参加连接的元组就可以大大减少,这是代数优化
3.5 查询优化的一般策略
- 先做选择运算。这是最重要、最基本的一条优化策略。
- 在执行连接运算前,对关系适当预处理。
- 在连接属性上建立索引,或对关系进行排序,再执行连接运算
- 同时进行投影和选择运算
- 如有若干投影和选择运算,并且它们都对同一个关系操作,则可以在扫描此关系的同时完成所有的这些运算,以避免重复扫描关系。
- 把投影同其前或其后的双目运算结合起来,没有必要为了去掉某些字段而扫描一遍关系。
- 把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算,连接特别是等值连接运算要比同样关系上的笛卡尔积省很多时间。
- 找出公共子表达式
- 如果重复出现的子表达式的结果占用较小的空间,并且从外存中读入这个运算结果比计算该子表达式的时间少,
则先计算一次公共子表达式并把结果写入中间文件。
3.6 关系代数表达式等价变换规则
- 代数优化策略:通过对关系代数表达式的等价变换来提高查询效率
- 关系代数表达式的等价:指用相同的关系代替两个表达式中相应的关系所得到的结果是相同的
- 两个关系表达式E1和E2是等价的,可记为E1≡E2
3.7 查询优化的一般步骤
- 把查询转换成语法树
- 如图4-6所示
- 变换语法树
- 使用关系代数表达式的优化规则对初始的语法树进行优化
- 将选择运算$ \sigma_{SC.Cno='1024'} $移到叶子结点,如图4-7所示,将笛卡儿积选择运算转换为自然连接,如图4-8所示

- 选择低层的存取路径
- 计算关系代数表达式的值时,要使用索引、数据的存储分布等信息,利用它们进一步改善查询效率。
- 生成查询计划
- 查询计划由一组内部过程组成,这组内部过程按选定的存取路径计算关系代数表达式的值。
- 一般有多个查询计划可供选择,计算不同查询计划的代价,选择代价最小的一个,在计算代价时主要考虑磁盘的I/O次数。

浙公网安备 33010602011771号