关系数据库第六章笔记---关系查询处理和查询优化

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

查询处理步骤

image-20210421163634158.png

1.查询分析

查询分析的任务:对查询语句进行扫描、词法分析和语法分析

  • 词法分析:从查询语句中识别出正确的语言符号。
  • 语法分析:进行语法检查

2.查询检查

  • 查询检查的任务

    • 合法权检查
    • 视图转换
    • 安全性检查
    • 完整性初步检查
  • 根据数据字典中有关的模式定义检查语句中的数据库对象,如关系名、属性名是否存在和有效

  • 如果是对视图的操作,则要用视图消解方法把对视图的操作转换成对基本表的操作

  • 根据数据字典中的用户权限和完整性约束定义对用户的存取权限进行检查。

  • 检查通过后把SQL查询语句转换成内部表示,即等价的关系代数表达式。

  • 关系数据库管理系统一般都用查询树,也称为语法分析树来表示扩展的关系代数表达式

3.查询优化

查询优化:选择一个高效执行的查询处理策略

  • 查询优化分类
    • 代数优化/逻辑优化:指关系代数表达式的优化
    • 物理优化:指存取路径和底层操作算法的选择
  • 查询优化的选择依据
    • 基于规则(rule based)
    • 基于代价(cost based)
    • 基于语义(semantic based)

4.查询执行

  • 依据优化器得到的执行策略生成查询执行计划
  • 代码生成器(code generator)生成执行查询计划的代码
  • 两种执行方法
    • 自顶向下
    • 自底向上

实现查询操作的算法示例

1.选择操作的实现

选择操作典型实现方法:

全表扫描方法 (Table Scan)
  • 对查询的基本表顺序扫描,逐一检查每个元组是否满足选择条件,把满足条件的元组作为结果输出
  • 适合小表,不适合大表
索引扫描方法 (Index Scan)
  • 适合于选择条件中的属性上有索引(例如B+树索引或Hash索引)
  • 通过索引先找到满足条件的元组主码或元组指针,再通过元组指针直接在查询的基本表中找到元组

[例6.1]

SELECT *
FROM Student
WHERE <条件表达式>

考虑<条件表达式>的几种情况:
C1:无条件;
C2:Sno='201215121';
C3:Sage>20;
C4:Sdept='CS' AND Sage>20
  • 全表扫描算法

    • 假设可以使用的内存为M块,全表扫描算法思想:
      1. 按照物理次序读Student的M块到内存
      2. 检查内存的每个元组t,如果满足选择条件,则输出t
      3. 如果student还有其他块未被处理,重复①和②
  • 索引扫描算法

    • C2:假设Sno上有索引(或Sno是散列码)

      • 算法
      1. 使用索引(或散列)得到Sno为‘201215121’ 元组的指针
      2. 通过元组指针在Student表中检索到该学生
    • C3:假设Sage 上有B+树索引

      • 算法
      1. 使用B+树索引找到Sage=20的索引项,以此为入口点在B+树的顺序集上得到Sage>20的所有元组指针
      2. 通过这些元组指针到student表中检索到所有年龄大于20的学生
    • C4:假设Sdept和Sage上都有索引

      • 算法一:
        1. 分别用Index Scan找到Sdept=’CS’的一组元组指针和Sage>20的另一组元组指针。
        2. 求这两组指针的交集
        3. 到Student表中检索
        4. 得到计算机系年龄大于20的学生
      • 算法二:
        1. 找到Sdept=’CS’的一组元组指针
        2. 通过这些元组指针到Student表中检索
        3. 并对得到的元组检查另一些选择条件(如Sage>20)是否满足
        4. 把满足条件的元组作为结果输出

2.连接操作的实现

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

嵌套循环算法(nested loop join)

步骤:

  1. 对外层循环(Student表)的每一个元组(s),检索内层循环(SC表)中的每一个元组(sc)
  2. 检查这两个元组在连接属性(Sno)上是否相等
  3. 如果满足连接条件,则串接后作为结果输出,直到外层循环表中的元组处理完为止
排序-合并算法(sort-merge join 或merge join)

步骤:

  1. 如果连接的表没有排好序,先对Student表和SC表按连接属性Sno排序
  2. 取Student表中第一个Sno,依次扫描SC表中具有相同Sno的元组
  3. 当扫描到Sno不相同的第一个SC元组时,返回Student表扫描它的下一个元组,再扫描SC表中具有相同Sno的元组,把它们连接起来
  4. 重复上述步骤直到Student 表扫描完

image-20210421165215437.png

总结:

  • Student表和SC表都只要扫描一遍
  • 如果两个表原来无序,执行时间要加上对两个表的排序时间
  • 对于大表,先排序后使用排序-合并连接算法执行连接,总的时间一般仍会减少
索引连接(index join)算法

步骤:

  1. 在SC表上已经建立属性Sno的索引
  2. 对Student中每一个元组,由Sno值通过SC的索引查找相应的SC元组
  3. 把这些SC元组和Student元组连接起来,循环执行②③,直到Student表中的元组处理完为止。
Hash Join算法

步骤:

  1. 把连接属性作为hash码,用同一个hash函数把Student表和SC表中的元组散列到hash表中
  2. 划分阶段(building phase, 也称为partitioning phase)
    • 对包含较少元组的表(如Student表)进行一遍处理;
    • 把它的元组按hash函数分散到hash表的桶中;
  3. 试探阶段(probing phase,也称为连接阶段join phase)
    • 对另一个表(SC表)进行一遍处理
    • 把SC表的元组也按同一个hash函数(hash码是连接属性)进行散列
    • 把SC元组与桶中来自Student表并与之相匹配的元组连接起来;

前提:上面hash join算法前提:假设两个表中较小的表在第一阶段后可以完全放入内存的hash桶中

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

关系查询优化是影响关系数据库管理系统性能的关键因素

查询优化概述

关系系统的查询优化

  • 是关系数据库管理系统实现的关键技术又是关系系统的优点所在
  • 减轻了用户选择存取路径的负担

非关系系统

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

查询优化的优点

  • 用户不必考虑如何最好地表达查询以获得较好的效率

  • 系统可以比用户程序的“优化”做得更好

    • 优化器可以从数据字典中获取许多统计信息,而用户程序则难以获得这些信息
    • 如果数据库的物理统计信息改变了,系统可以自动对查询重新优化以选择相适应的执行计划。在非关系系统中必须重写程序,而重写程序在实际应用中往往是不太可能的
    • 优化器可以考虑数百种不同的执行计划,程序员一般只能考虑有限的几种可能性
    • 优化器中包括了很多复杂的优化技术,这些优化技术往往只有最好的程序员才能掌握。系统的自动优化相当于使得所有人都拥有这些优化技术
  • 关系数据库管理系统通过某种代价模型计算出各种查询执行策略的执行代价,然后选取代价最小的执行方案

    • 集中式数据库
      • 执行开销主要包
        • 磁盘存取块数(I/O代价)
        • 处理机时间(CPU代价)
        • 查询的内存开销
      • I/O代价是最主要的
    • 分布式数据库
      • 总代价=I/O代价+CPU代价+内存代价+通信代价

查询优化的总目标

  • 选择有效的策略
  • 求得给定关系表达式的值
  • 使得查询代价最小(实际上是较小)

实例

求选修了2号课程的学生姓名

SELECT Student.Sname
FROM Student, SC
WHERE Student.Sno=SC.Sno AND
	  SC.Cno=2

假定学生-课程数据库中有1000个学生记录,10000个选课记录

选修2号课程的选课记录为50个

可以用多种等价的关系代数表达式来完成这一查询

image-20210421170318536.png

第一种情况

KaTeX parse error: Undefined control sequence: \and at position 43: …dent.Sno=SC.Sno\̲a̲n̲d̲ ̲SC.Cno='2'}(Stu…

  1. 计算广义笛卡尔积
    • 算法
      • 在内存中尽可能多地装入某个表(如Student表)的若干块,留出一块存放另一个表(如SC表)的元组
      • 把SC中的每个元组和Student中每个元组连接,连接后的元组装满一块后就写到中间文件上
      • 从SC中读入一块和内存中的Student元组连接,直到SC表处理完
      • 再读入若干块Student元组,读入一块SC元组。
      • 重复上述处理过程,直到把Student表处理完

设一个块能装10个Student元组或100个SC元组,在内存中存放5块Student元组和1块SC元组,则读取总块数为:

1000 10 + 1000 10 × 5 × 10000 100 = 100 = 20 × 100 = 2100 \frac{1000}{10}+\frac{1000}{10\times 5}\times \frac{10000}{100}=100=20\times 100=2100 101000+10×51000×10010000=100=20×100=2100

  • 读Student表100块,读SC表20遍,每遍100块,则总计要读取2100数据块
  • 连接后的元组数为 1 0 3 × 1 0 4 = 1 0 7 10^3×10^4=10^7 103×104=107。设每块能装10个元组,则写出 1 0 6 10^6 106
  1. 作选择操作
    • 依次读入连接后的元组,按照选择条件选取满足要求的记录
    • 假定内存处理时间忽略。读取中间文件花费的时间(同写中间文件一样)需读入 1 0 6 10^6 106
    • 若满足条件的元组假设仅50个,均可放在内存
  2. 作投影操作
    • 把第(2)步的结果在Sname上作投影输出,得到最终结果

第一种情况下执行查询的总读写数据块为: 2100 + 1 0 6 + 1 0 6 2100+10^6+10^6 2100+106+106

第二种情况

Q 2 = π S n a m e ( σ S C . C n o = ′ 2 ′ ( S t u d e n t ⋈ S C ) ) Q_2=\pi_{Sname}(\sigma_{SC.Cno='2'}(Student\bowtie SC)) Q2=πSname(σSC.Cno=2(StudentSC))

  1. 计算自然连接
    • 执行自然连接,读取Student和SC表的策略不变,总的读取块数仍为2100块
    • 自然连接的结果比第一种情况大大减少,为 1 0 4 10^4 104 个元组写出数据块=$ 10^3$ 块
  2. 读取中间文件块,执行选择运算,读取的数据块= 1 0 3 10^3 103
  3. 把第2步结果投影输出

第二种情况下执行查询的总读写数据块= 2100 + 1 0 3 + 1 0 3 2100+ 10^3 +10^3 2100+103+103

其执行代价大约是第一种情况的488分之一

第三种情况

$Q_3=\pi {Sname}(Student\bowtie \sigma{SC.Cno=‘2’}(SC)) $

  1. 先对SC表作选择运算,只需读一遍SC表,存取100块,因为满足条件的元组仅50个,不必使用中间文件
  2. 读取Student表,把读入的Student元组和内存中的SC元组作连接。也只需读一遍Student表共100块
  3. 把连接结果投影输出

第三种情况总的读写数据块=100+100

其执行代价大约是第一种情况的万分之一,是第二种情况的20分之一

小结

  • 假如SC表的Cno字段上有索引

    • 第一步就不必读取所有的SC元组而只需读取Cno=‘2’的那些元组(50个)
    • 存取的索引块和SC中满足条件的数据块大约总共3~4块
  • 若Student表在Sno上也有索引

    • 不必读取所有的Student元组
    • 因为满足条件的SC记录仅50个,涉及最多50个Student记录
    • 读取Student表的块数也可大大减少
  • 由代数表达式Q1变换为Q2、Q3的过程大大减少了读写次数

    • 因此有选择和连接操作时,先做选择操作,这样参加连接的元组就可以大大减少,这是代数优化
  • SC表的选择操作算法有全表扫描或索引扫描,经过初步估算,索引扫描方法较优

    • 对于Student和SC表的连接,利用Student表上的索引,采用索引连接代价也较小,这就是物理优化

代数优化

关系代数表达式的优化

  • 代数优化策略:通过对关系代数表达式的等价变换来提高查询效率
  • 关系代数表达式的等价:指用相同的关系代替两个表达式中相应的关系所得到的结果是相同的
  • 两个关系表达式 E 1 E_1 E1 E 2 E_2 E2是等价的,可记为 E 1 ≡ E 2 E_1 ≡E_2 E1E2

常用的等价变换规则

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

设E 和E 是关系代数表达式,F是连接运算的条件,则有:
E 1 × E 2 ≡ E 2 × E 1 E 1 ⋈ E 2 ≡ E 2 ⋈ E 1 E 1 ⋈ F E 2 ≡ E 2 ⋈ F E 1 E_1\times E_2\equiv E_2\times E_1\\ E_1 \bowtie E_2\equiv E_2\bowtie E_1\\ E_1 \underset{F}{\bowtie} E_2\equiv E_2\underset{F}{\bowtie} E_1\\ E1×E2E2×E1E1E2E2E1E1FE2E2FE1

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

设E ,E ,E 是关系代数表达式,F 和F 是连接运算的条件
( E 1 × E 2 ) × E 3 ≡ ( E 1 × E 2 ) × E 3 ( E 1 ⋈ E 2 ) ⋈ E 3 ≡ ( E 1 ⋈ E 2 ) ⋈ E 3 ( E 1 ⋈ F 1 E 2 ) ⋈ F 2 E 3 ≡ ( E 1 ⋈ F 1 E 2 ) ⋈ F 2 E 3 (E_1\times E_2)\times E_3 \equiv (E_1\times E_2)\times E_3\\ (E_1\bowtie E_2)\bowtie E_3 \equiv (E_1\bowtie E_2)\bowtie E_3\\ (E_1\underset{F_1}{\bowtie} E_2)\underset{F_2}{\bowtie} E_3 \equiv (E_1\underset{F_1}{\bowtie} E_2)\underset{F_2}{\bowtie} E_3\\ (E1×E2)×E3(E1×E2)×E3(E1E2)E3(E1E2)E3(E1F1E2)F2E3(E1F1E2)F2E3

3.投影的串接定律

π A 1 , A 2 , ⋯   , A n ( π B 1 , B 2 , ⋯   , B n ( E ) ) ≡ π A 1 , A 2 , ⋯   , A n ( E ) \pi_{A_1,A_2,\cdots,A_n}(\pi_{B_1,B_2,\cdots,B_n}(E))\equiv \pi_{A_1,A_2,\cdots,A_n}(E) πA1,A2,,An(πB1,B2,,Bn(E))πA1,A2,,An(E)

  • E是关系代数表达式
  • A i ( i = 1 , 2 , ⋯   , n ) , B j ( j = 1 , 2 , ⋯   , m ) A_i(i=1,2,\cdots,n),B_j(j=1,2,\cdots,m) Ai(i=1,2,,n),Bj(j=1,2,,m)是属性名
  • KaTeX parse error: Undefined control sequence: \mbox at position 23: …_2,\cdots,A_n\}\̲m̲b̲o̲x̲{构成}\{B_1,B_2,\…的子集

4.选择的串接定律

KaTeX parse error: Undefined control sequence: \and at position 48: …quiv\sigma_{F_1\̲a̲n̲d̲ ̲F_2}(E)

  • E是关系代数表达式,$F_1 、F_2 $是选择条件
  • 选择的串接律说明选择条件可以合并,这样一次就可检查全部条件

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

σ F ( π A 1 , A 2 , ⋯   , A n ( E ) ) ≡ π A 1 , A 2 , ⋯   , A n ( σ F ( E ) ) \sigma_F(\pi_{A_1,A_2,\cdots,A_n}(E))\equiv \pi_{A_1,A_2,\cdots,A_n}(\sigma_F(E)) σF(πA1,A2,,An(E))πA1,A2,,An(σF(E))

若F中有不属于$A_1 ,…,A_n 的 属 性 的属性 B_1 ,…,B_n $有更一般规则
π A 1 , A 2 , ⋯   , A n ( σ F ( E ) ) ≡ π A 1 , A 2 , ⋯   , A n ( σ F ( π A 1 , A 2 , ⋯   , A n , B 1 , B 2 , ⋯   , B n ( E ) ) ) \pi_{A_1,A_2,\cdots,A_n}(\sigma_F(E))\equiv \pi_{A_1,A_2,\cdots,A_n}(\sigma_F(\pi_{A_1,A_2,\cdots,A_n,B_1,B_2,\cdots,B_n}(E))) πA1,A2,,An(σF(E))πA1,A2,,An(σF(πA1,A2,,An,B1,B2,,Bn(E)))
其中选择条件F只涉及属性$A_1 ,…,A_n $

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

  • 如果F中涉及的属性都是 E 1 E_1 E1中的属性,则

σ F ( E 1 × E 2 ) ≡ σ F ( E 1 ) × E 2 \sigma_F(E_1\times E_2)\equiv \sigma_F(E_1)\times E_2 σF(E1×E2)σF(E1)×E2

  • 如果KaTeX parse error: Undefined control sequence: \and at position 6: F=F_1\̲a̲n̲d̲ ̲F_2,并且 F 1 F_1 F1只涉及 E 1 E_1 E1中的属性,$F_2 只 涉 及 只涉及 E_2$中中的属性,则由上面的等价变换规则1,4,6可推出:

σ F ( E 1 × E 2 ) ≡ σ F ( E 1 ) × σ F ( E 2 ) \sigma_F(E_1\times E_2)\equiv \sigma_F(E_1)\times \sigma_F(E_2) σF(E1×E2)σF(E1)×σF(E2)

  • 若$F_1 只 涉 及 只涉及 E_1 中 的 属 性 , 中的属性, F_2 涉 及 涉及 E_1 和 和 E_2$两者的属性,则仍有:

σ F ( E 1 × E 2 ) ≡ σ F ( σ F 1 ( E 1 ) × E 2 ) \sigma_F(E_1\times E_2)\equiv \sigma_F(\sigma_{F_1}(E_1)\times E_2) σF(E1×E2)σF(σF1(E1)×E2)

  • 它使部分选择在笛卡尔积前先做

7. 选择与并的分配律

设$E=E_1 ∪E_2 , , E_1 , , E_2 $有相同的属性名,则
σ F ( E 1 ∪ E 2 ) ≡ σ F ( E 1 ) ∪ σ F ( E 2 ) \sigma_F(E_1\cup E_2)\equiv \sigma_F(E_1)\cup \sigma_F(E_2) σF(E1E2)σF(E1)σF(E2)

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

若$E_1 与 与 E_2 $有相同的属性名,则
σ F ( E 1 − E 2 ) ≡ σ F ( E 1 ) − σ F ( E 2 ) \sigma_F(E_1- E_2)\equiv \sigma_F(E_1)- \sigma_F(E_2) σF(E1E2)σF(E1)σF(E2)

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

σ F ( E 1 ⋈ E 2 ) ≡ σ F ( E 1 ) ⋈ σ F ( E 2 ) \sigma_F(E_1\bowtie E_2) \equiv \sigma_F(E_1)\bowtie \sigma_F(E_2)\\ σF(E1E2)σF(E1)σF(E2)

F只涉及$E_1 与 与 E_2 $的公共属性

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

设$E_1 和 和 E_2 是 两 个 关 系 表 达 式 , 是两个关系表达式, A_1 ,…,A_n 是 是 E_1 的 属 性 , 的属性, ,B_1 ,…,B_m 是KaTeX parse error: Can't use function '$' in math mode at position 5: E_2 $̲的属性,则
\pi_{A_1,A_2,\cdots,A_n,B_1,B_2,\cdots,B_m}(E_1\times E_2)\equiv \pi_{A_1,A_2,\cdots,A_n}(E_1)\times \pi_{B_1,B_2,\cdots,B_m}(E_2)
$$

11. 投影与并的分配律

设$E_1 和 和 E_2 $有相同的属性名,则
π A 1 , A 2 , ⋯   , A n ( E 1 ∪ E 2 ) ≡ π A 1 , A 2 , ⋯   , A n ( E 1 ) ∪ π A 1 , A 2 , ⋯   , A n ( E 2 ) \pi_{A_1,A_2,\cdots,A_n}(E_1\cup E_2)\equiv \pi_{A_1,A_2,\cdots,A_n}(E_1)\cup \pi_{A_1,A_2,\cdots,A_n}(E_2) πA1,A2,,An(E1E2)πA1,A2,,An(E1)πA1,A2,,An(E2)

查询树的启发式优化

典型的启发式规则

  1. 选择运算应尽可能先做

    在优化策略中这是最重要、最基本的一条

  2. 把投影运算和选择运算同时进行

    如有若干投影和选择运算,并且它们都对同一个关系操作,则可以在扫描此关系的同时完成所有的这些运算以避免重复扫描关系

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

  4. 把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算,连接特别是等值连接运算要比同样关系上的笛卡尔积省很多时间

  5. 找出公共子表达式

    • 如果这种重复出现的子表达式的结果不是很大的关系
    • 并且从外存中读入这个关系比计算该子表达式的时间少得多
    • 则先计算一次公共子表达式并把结果写入中间文件是合算的
    • 当查询的是视图时,定义视图的表达式就是公共子表达式的情况。

优化关系表达式的算法

  • 算法:关系表达式的优化
  • 输入:一个关系表达式的查询树
  • 输出:优化的查询树
  • 方法
    1. 利用等价变换规则4把形如KaTeX parse error: Undefined control sequence: \and at position 12: \sigma_{F_1\̲a̲n̲d̲ ̲F_2\and \cdots …变换为 σ F 1 ( σ F 2 ( ⋯ ( σ F n ( E ) ) ⋯   ) ) \sigma_{F_1}(\sigma_{F_2}(\cdots(\sigma_{F_n}(E))\cdots)) σF1(σF2((σFn(E))))
    2. 对每一个选择,利用等价变换规则4~9尽可能把它移到树的叶端
    3. 对每一个投影利用等价变换规则3,5,10,11中的一般形式尽可能把它移向树的叶端
      • 注意
        • 等价变换规则3使一些投影消失或使一些投影出现。
        • 规则5把一个投影分裂为两个,其中一个有可能被移向树的叶端。
    4. 利用等价变换规则3~5,把选择和投影的串接合并成单个选择、单个投影或一个选择后跟一个投影,使多个选择或投影能同时执行,或在一次扫描中全部完成
    5. 把上述得到的语法树的内节点分组
      • 每一双目运算 ( × , ⋈ , ∪ , − ) (\times,\bowtie,\cup,-) (×)和它所有的直接祖先为一组(这些直接祖先是( σ , π \sigma,\pi σπ运算)
      • 如果其后代直到叶子全是单目运算,则也将它们并入该组
      • 但当双目运算是笛卡尔积 ( × ) (\times) (×),而且后面不是与它组成等值连接的选择时,则不能把选择与这个双目运算组成同一组

例:求选修了2号课程的学生姓名

SELECT Student.Sname
FROM Student, SC
WHERE Student.Sno=SC.Sno AND
	  SC.Cno=2
  1. 把SQL语句转换成查询树,如下图所示

image-20210422002205491.png

为了使用关系代数表达式的优化法,假设内部表示是关系代数语法树,则上面的查询树如下图所示。

image-20210422002245692.png

  1. 对查询树进行优化
    • 利用规则4、6把选择 σ S C . C n o = ‘ 2 ’ \sigma_{SC.Cno}=‘2’ σSC.Cno=2移到叶端,上图查询树便转换成下图优化的查询树。这就是Q3的查询树表示
    • $Q_3=\pi {Sname}(Student\bowtie \sigma{SC.Cno=‘2’}(SC)) $

image-20210422002351544.png

物理优化

选择高效合理的操作算法或存取路径,求得优化的查询计划

物理优化方法

基于规则的启发式优化

启发式规则是指那些在大多数情况下都适用,但不是在每种情况下都是适用的规则

基于代价估算的优化

优化器估算不同执行策略的代价,并选出具有最小代价的执行计划

两者结合的优化方法

  • 常常先使用启发式规则,选取若干较优的候选方案,减少代价估算的工作量
  • 然后分别计算这些候选方案的执行代价,较快地选出最终的优化方案

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

1.选择操作的启发式规则

  • 对于小关系,使用全表顺序扫描,即使选择列上有索引
  • 对于大关系,启发式规则有
    1. 对于选择条件是“主码=值”的查询
      • 查询结果最多是一个元组,可以选择主码索引
      • 一般的关系数据库管理系统会自动建立主码索引
    2. 对于选择条件是“非主属性=值”的查询,并且选择列上有索引
      • 要估算查询结果的元组数目
      • 如果比例较小(<10%)可以使用索引扫描方法
      • 否则还是使用全表顺序扫描
    3. 对于选择条件是属性上的非等值查询或者范围查询,并且选择列上有索引
      • 要估算查询结果的元组数目
      • 如果比例较小(<10%)可以使用索引扫描方法
      • 否则还是使用全表顺序扫描
    4. 对于用AND连接的合取选择条件
      • 如果有涉及这些属性的组合索引
        • 优先采用组合索引扫描方法
      • 如果某些属性上有一般的索引,可以用索引扫描方法
        • 通过分别查找满足每个条件的指针,求指针的交集
        • 通过索引查找满足部分条件的元组,然后在扫描这些元组时判断是否满足剩余条件
    5. 对于用OR连接的析取选择条件,一般使用全表顺序扫描

2.连接操作的启发式规则

  1. 如果2个表都已经按照连接属性排序
    • 选用排序-合并算法
  2. 如果一个表在连接属性上有索引
    • 选用索引连接算法
  3. 如果上面2个规则都不适用,其中一个表较小
    • 选用Hash join算法
  4. 可以选用嵌套循环方法,并选择其中较小的表,确切地讲是占用的块数(b)较少的表,作为外表(外循环的表)
    • 理由:
    • 设连接表R与S分别占用的块数为Br与Bs
    • 连接操作使用的内存缓冲区块数为K
    • 分配K-1块给外表
    • 如果R为外表,则嵌套循环法存取的块数为Br+Br Bs/(K-1)
    • 显然应该选块数小的表作为外表

基于代价的优化

  • 启发式规则优化是定性的选择,适合解释执行的系统
    • 解释执行的系统,优化开销包含在查询总开销之中
  • 编译执行的系统中查询优化和查询执行是分开的
    • 可以采用精细复杂一些的基于代价的优化方法

1.统计信息

  • 基于代价的优化方法要计算查询的各种不同执行方案的执行代价,它与数据库的状态密切相关

  • 优化器需要的统计信息

  1. 对每个基本表
    • 该表的元组总数(N)
    • 元组长度(l)
    • 占用的块数(B)
    • 占用的溢出块数(BO)
  2. 对基表的每个列
    • 该列不同值的个数(m)
    • 列最大值
    • 最小值
    • 列上是否已经建立了索引
    • 哪种索引(B+树索引、Hash索引、聚集索引)
    • 可以计算选择率(f)
      • 如果不同值的分布是均匀的, f = 1 m f=\frac{1}{m} fm1
      • 如果不同值的分布不均匀,则要计算每个值的选择率,f=具有该值的元组数/N
  3. 对索引
    • 索引的层数(L)
    • 不同索引值的个数
    • 索引的选择基数S(有S个元组具有某个索引值)
    • 索引的叶结点数(Y)

2.代价估算示例

  1. 全表扫描算法的代价估算公式
    • 如果基本表大小为B块,全表扫描算法的代价 cost=B
    • 如果选择条件是“码=值”,那么平均搜索代价 cost=B/2
  2. 索引扫描算法的代价估算公式
    • 如果选择条件是“码=值”
      • 则采用该表的主索引
      • 若为B+树,层数为L,需要存取B+树中从根结点到叶结点L块,再加上基本表中该元组所在的那一块,所以cost=L+1
    • 如果选择条件涉及非码属性
      • 若为B+树索引,选择条件是相等比较,S是索引的选择基数(有S个元组满足条件)
      • 满足条件的元组可能会保存在不同的块上,所以(最坏的情况)cost=L+S
    • 如果比较条件是>,>=,<,<=操作
      • 假设有一半的元组满足条件
      • 就要存取一半的叶结点
      • 通过索引访问一半的表存储块
      • c o s t = L + Y 2 + B 2 cost=\frac{L+Y}{2} +\frac{B}{2} cost=2L+Y+2B
      • 如果可以获得更准确的选择基数,可以进一步修正Y/2与B/2
  3. 嵌套循环连接算法的代价估算公式
    • 嵌套循环连接算法的代价
      • c o s t = B r + B r B s K − 1 cost=Br+\frac{ BrBs}{K-1} costBr+K1BrBs
    • 如果需要把连接结果写回磁盘
      • c o s t = B r + B r B s K − 1 + F r s ∗ N r ∗ N s M r s cost=Br+\frac{ BrBs}{K-1}+\frac{ Frs*Nr*Ns}{Mrs} costBr+K1BrBs+MrsFrsNrNs
      • 其中Frs为连接选择性(join selectivity),表示连接结果元组数的比例。
      • Mrs是存放连接结果的块因子,表示每块中可以存放的结果元组数目
  4. 排序-合并连接算法的代价估算公式
    • 如果连接表已经按照连接属性排好序,则
      • c o s t = B r + B s + F r s ∗ N r ∗ N s M r s cost=Br+Bs+\frac{ Frs*Nr*Ns}{Mrs} costBr+Bs+MrsFrsNrNs
    • 如果必须对文件排序
      • 还需要在代价函数中加上排序的代价。
      • 对于包含B个块的文件排序的代价大约是 ( 2 ∗ B ) + ( 2 ∗ B ∗ log ⁡ 2 B ) (2*B)+(2*B*\log_2B) (2B)+(2Blog2B)

小结

  • 查询处理是关系数据库管理系统的核心,查询优化技术是查询处理的关键技术。
  • 本章主要内容
    • 查询处理过程
    • 查询优化
      • 代数优化
      • 物理优化
    • 查询执行
      • 自顶向下执行方式
      • 自底向上执行方式
  • 对于比较复杂的查询,尤其是涉及连接和嵌套的查询
    • 不要把优化的任务全部放在关系数据库管理系统上
    • 应该找出关系数据库管理系统的优化规律,以写出适合关系数据库管理系统自动优化的SQL语句
  • 对于关系数据库管理系统不能优化的查询需要重写查询语句,进行手工调整以优化性能
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hydrion-Qlz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值