【数据库系统概论】-关系查询处理和查询优化

来源:互联网 发布:bartender中vb脚本 编辑:程序博客网 时间:2024/04/29 11:40

查询优化一般可以分为代数优化和物理优化,代数优化是指关系代数表达式的优化,物理优化则是指存取路径和底层操作算法的选择。

关系数据库系统的查询处理

查询处理步骤

RDBMS查询处理可以分为四个阶段:查询分析、查询检查、查询优化和查询执行。

1.查询分析

对查询语句进行扫描、词法分析、语法分析。从查询语句中识别出语言符号,进行语法检查和语法分析,判断查询语句是否符合SQL语法规则。

2.查询检查

根据数据字典对合法的查询语句进行语义检查,即检查语句中的数据库对象。还要根据数据字典中的用户权限和完整性约束定义对用户的存取权限进行检查。检查通过后便把SQL查询语句转换成等价的关系代数表达式。RDBMS一般都用查询树,也称为语法分析树,来表示扩展的关系代数表达式。

3.查询优化

查询优化就是选择一个高效执行的查询处理策略。代数优化是指关系代数表达式的优化,即按照一定的规则,改变代数表达式中操作的次序和组合,使查询执行效率更高;物理优化则是指存取路径和底层操作算法的选择。

4.查询执行

根据优化器得到的执行策略生成查询计划,由代码生成器生成执行这个查询计划的代码。

实现查询操作的算法

一、选择操作的实现

1.简单的全表扫描法

对查询的基本表顺序扫描,逐一检查每个元组是否满足选择条件,把满足条件的元组输出

2.索引(或散列)扫描法

如果选择条件中的属性上有索引,而已用索引扫描法。先通过索引找到满足条件的元组的主码或元组指针,再通过元组指针直接在查询的基本表中找到元组。

二、连接操作的实现

连接操作时查询处理中最耗时的操作之一。

1.嵌套循环法

简单可行的算法。对外层循环的每一个元组,检索内层循环中的每一个元组,兵哥检查者两个元组在连接属性上是否满足要求。

2.排序-合并方法

适合连接的诸表已经排好序的情况

步骤如下

①如果连接的彪没有排好序,首先对一个表按连接属性排序

②取排好序的表内的第一个元组,一次扫描SC表中具有符合要求的元组,把它们连接起来

③当骚猫到不相同的第一个元组时,返回排好序的那一个表,扫描它的下一个元组,再重复扫描。

3.索引连接方法

步骤如下

①在第二个表上建立索引

②对第一个表中的每一个元组,通过索引找到第二个表上的元组

③连接

4.HASH Join 方法

划分阶段,对包含较少元素的表进行一遍处理,把它的元组按hash函数分扫到hash表的桶中;

试探阶段,对另一个表进行一遍处理,把元组散列到适当的hash桶中,并把元组与桶中所有来自R并与之匹配的元组连接。

关系数据库系统的查询优化

查询优化在关系数据库系统中有着非常重要的地位。关系查询优化是影响RDBMS性能的关键因素。

优化对关系系统来说既是挑战又是机遇。所谓挑战是指关系系统为了达到用户可以接受的性能必须进行查询优化。由于关系表达式的语义级别很高,使关系系统可以从关系表达式中分析查询语义,提供了执行查询优化的可能性。

查询优化概述

关系系统的查询优化既是RDBMS实现的关键技术又是关系系统的优点所在。它减轻了用户选择存取路径的负担。

用户使用过程化的语言表达查询要求,执行何种记录级的操作,以及操作的序列是由用户而不是由系统来决定的。因此用户必须了解存取路径,系统要提供用户选择存取路径的手段,查询效率由用户的存取策略决定。

查询优化的优点不仅在于用户不必考虑如何最好地表达查询以获得较好的效率,而且在于系统可以比用户程序的“优化”做得更好。

(1)优化器可以从数据字典中获取许多统计信息。优化器可以根据这些信息做出正确的估算,选择高效的执行计划,而用户程序则难以获得这些信息。

(2)如果数据库的物理统计信息改变了,系统可以自动对查询进行重新优化以选择相适应的执行计划。在非关系系统中必须重写程序,而重写程序在实际应用中往往是不太可能的。

(3)优化器可以考虑数百种不同的执行计划,而程序员一般只能考虑有限的几种可能性。

(4)优化器中包括了很多复杂的优化技术,这些优化技术往往只有最好的程序员才能掌握。


总代价 =  I/O代价 + CPU代价 + 内存代价 + 通信代价


集中式数据库中I/O代价是最主要的。

查询优化的总目标是:选择有效地策略,求得给定关系表达式的值,使得查询代价最小。

代数优化

关系代数表达式等价变换规则

代数优化策略是通过对关系代数表达式的等价变换来提高查询效率。所谓关系表达式的等价是指用相同的关系代替两个表达式中相应的关系所得到的结果是相同的。

1、连接、笛卡尔积交换律

E1 × E2 ≡ E2 × E1

E1 ∞ E2 ≡ E2 E1

2、连接、笛卡尔积结合律

(E1 × E2) × E3 ≡ E1 × (E2 × E3)

(E1 E2) E3 ≡ E1 (E2 E3)

3、投影的串接定律

π[A1,A2,...,An]( π[B1,B2,...,Bm]( E ) )≡π[A1,A2,...,An]( E )

4、选择的串接定律

σ[F1]( σ[F2]( E ) ) ≡ σ[F1 and F2]( E )

5、选择与投影操作的交换律

σ[F]( π[A1,A2,...,An]( E ) )π[A1,A2,...,An]( σ[F]( E ) )

6、选择与笛卡尔积的交换律

如果F中设计的属性都是E1中的属性,则

σ[F]( E1 × E2 ) ≡ σ[F]( E1 ) × E2

7、选择与并的分配律

σ[F]( E1 ∪ E2 ) ≡ σ[F]( E1 ) ∪ σ[F]( E2 )

8、选择与差运算的分配律

σ[F]( E1 - E2 ) ≡ σ[F]( E1 ) - σ[F]( E2 )

9、选择对自然连接的分配律

σ[F]( E1 ∞ E2 ) ≡ σ[F]( E1 ) σ[F]( E2 )

10、投影与笛卡尔积的分配律

π[A1,A2,...,An,B1,B2,...,Bm]( E1 × E2 ) ≡ π[A1,A2,...,An]( E1 ) ×π[B1,B2,...,Bm]( E2 )

11、投影与并的分配律

π[A1,A2,...,An]( E1 ∪ E2 ) ≡ π[A1,A2,...,An]( E1 ) ∪ π[A1,A2,...,An]( E2 )

查询树的启发式优化

启发式规则:

(1)选择运算应尽可能先做。因为选择运算一般使中间结果大大变小。

(2)把投影运算和选择运算同时进行。避免重复扫描。

(3)投影同其前或其后的双目运算结合起来,没有必要为了去掉某一些字段而扫描一遍关系。

(4)把某些选择同在它前面要执行的笛卡尔积结合起来称为一个连接运算。

(5)找出公共子表达式。

算法:关系表达式的优化。

输入:一个关系表达式的查询树。

输出:优化的查询树。

(1)利用等价变换规则4,把形如σ[F1 and F2 and ... and Fn]( E )变换为σ[F1]( σ[F2]( ...(σ[Fn]( E ) )... ) )

(2)对每一个选择,利用等价变换规则4~9尽可能把它移到树的叶端。

(3)对每一个投影利用等价变换规则3,5,10,11中的一般形式尽可能把它移向树的叶端。

(4)利用等价变换规则3~5把选择和投影的串接合并成一个单选择、单个投影或一个选择后跟一个投影。

(5)把上述得到的语法书的内节点分组。每一个双目运算和它所有的直接祖先为一组。如果其后代直到叶子结点全是单目运算,则也将它们并入该组,但当双目运算是笛卡尔积,而且后面不是与它组成等值连接的选择时,则不能把选择与这个双目运算组成同一组。

物理优化

代数优化改变查询语句中操作次序和组合,不实际底层的存取路径。

基于启发式规则的存取路径选择优化

一、选择操作的启发式规则。

1、对于小关系,使用全表顺序扫描,及时选择列上有索引。

对于大关系,启发式规则有:

2、对于选择条件是非主属性=值的查询,查询结果最多是一个元组,可以选择主码索引。

3、对于选择条件是非主属性=值的查询,并且选择列上有索引,则要估算查询结果的元组数目,如果比例比较小,可以使用索引扫描方法,否则还是全表顺序扫描。

4、对于选择条件是属性上的非等值查询或者范围查询,并且选择列上有索引,同样要估算查询结果的元组数目,如果比例比较小,可以使用索引扫描方法,否则还是全表顺序扫描。

5、对于用AND连接的合取选择条件,如果有设计这些属性的组合索引,则优先采用组合索引扫描方法。

6、对于用OR连接的析取选择条件,一般使用全表顺序扫描。

二、连接操作的启发式规则

1、如果2个表都已经按照连接属性排序,则选用排序-合并方法

2、如果一个表在连接属性上有索引,则可以选用索引连接方法

3、如果上面2个规则都不使用,其中一个表较小,则可以用Hash join方法

4、最后可以选用嵌套循环方法,并选择其中较小的表,确切的讲是占用的块数较少的表,作为外表。

基于代价的优化

启发式规则优化是定性的选择,比较粗糙,但实现简单而且优化本社你的代价较小,适合解释执行的系统。

一、统计信息

1、对每个基本表,该表元组总数、元组长度、占用的块数、占用的溢出块数

2、对基表的每个列,该列不同值的个数、选择率、该列最大值、最小值该列上是否已经建立了索引,是哪种索引

3、对索引,该索引的层数,不同索引值的个数,索引的选择技术,索引的叶节点树。

0 0