第3部分:关系数据库管理系统原理part2

第3部分:关系数据库管理系统原理part2

题型:选择题、填空题、算法题、分析题分值:约35%

第9章:查询执行

  • 要求准确掌握基本概念熟练掌握算法的执⾏过程熟练分析算法的I/O代价及算法对内存的要求

img

查询处理的基本过程

排序的作用

 

img

 

外存归并排序:

  • 归并段、外存归并排序算法、算法的I/O代价分析、算法对内存的要求

两趟多路归并算法

  • 一趟是创建归并段这里,最多M个块,同时需要排序

  • 还有一趟是扫描所有的归并段进行读操作

img

 

img

创建归并段

  • 创建少于每个归并段块数少于M的归并段

  • 同时注意排序

img

创建归并段的运行实例

  • 创建并排序

img

多路归并算法

  • 扫描所有的归并段,进行归并排序

img

多路归并算法实例

img

 

img

 

img

 

img

算法分析

img

  • 注意最后一次归并结果的写入操作不用计入IO代价,因为流水线,写操作可以作为上一次的结果

img

 

img

多趟多路归并算法

 

img

 

img

双缓冲的概念

  • 同时一个归并段内读入两个块,一个块读完了,直接换另一个块中的元组,同时讲下一个块读入空闲的页中

img

选择操作的执行

  • 算法、算法的I/O代价分析、算法对内存的要求

img

 

img

基于扫描的选择算法

  • 很朴素的思想,直接二重循环遍历所有的元组找合适的元组

img

算法分析

  • 只需要一块作为遍历的判断即可

img

基于哈希的选择算法

  • 只适用于K=v的形式

img

算法分析

  • 假设均匀分布,这个值占用B/V个页

img

基于索引的选择算法

  • 利用B+树区间查询或者等值查询

img

算法分析

  • 聚簇索引,区间连续分布,直接按页读

  • 非聚簇,最差情况一个元组一个页,总元组数才是读的块数

img

 

投影操作的执行

算法、算法的I/O代价分析、算法对内存的要求

不带去重的投影算法

  • 类似于基于扫描的选择算法

img

 

img

 

 

去重操作的算法

  • 去重操作、集合操作、聚集操作的执⾏

  • ⼀趟算法、基于排序的算法、基于哈希的算法、算法的I/O代价分析、算法对内存的要求

img

一趟去重算法

  • 在缓冲区里面建立M-1页大小的哈希表

img

运行实例

img

 

算法分析

  • M-1块内能存下去重结果

img

基于排序的去重算法

  • 就是排序时候顺便去重

img

运行实例

img

 

img

 

img

 

img

 

img

算法分析

  • 和归并排序一样

img

基于哈希的去重算法

  • 重复元组必然在相同的桶,一个桶内不一定都重复

img

  • 再逐桶去重,取并集

img

运行实例

img

算法分析

  • 分桶要读,桶满了写回文件,每个桶还要去重

  • 可用内存页,每个桶不能超过M-1块(要逐桶去重),一共最多M-1个桶(桶满写回文件)

img

 

聚集操作的执行

  • 和去重没区别,先判断是否满足聚集条件,再去重

img

集合操作的执行

 

  • 交和并操作类似,这里只举例集合差

img

 

img

 

img

一趟集合差算法

  • 先把一个S的每一块读入缓冲池(M-1块),对R的每一块在缓冲区第M块执行集合差

img

 

 

运行实例

img

算法分析

img

基于哈希的集合差算法

  • 和去重类似先分桶(M-1个桶最多)

  • 然后用一趟去重进行去重(每个桶最多M-1页保证一趟集合差)

img

运行实例

img

算法分析

  • IO 分析:写桶读桶各两次,一趟集合差各一次

img

基于排序的集合差算法

  • 对归并段去重

img

算法分析

img

 

连接操作的执行

  • ⼀趟连接算法、基于排序的连接算法、基于哈希的连接算法、基于块的嵌套循环连接算法、基于索引的连接算法、算法的I/O代价分析、算法对内存的要求

img

一趟链接算法

  • 先读一个关系到缓存区中,然后连接

img

 

执行实例

img

算法分析

img

基于元组嵌套循环的连接

  • 双重循环,这也节省空间

img

算法分析

  • 对元组操作,IO代价高

img

基于块的嵌套循环连接

  • 对块二重循环

img

运行实例

img

算法分析

 

img

归并排序连接

  • 创建归并段

  • 每次先找最小的键

  • 读取所有有最小键的归并段进行连接

img

运行实例

img

 

img

 

img

 

img

 

img

复杂度分析

img

经典哈希连接

 

img

  • 桶号相同的才连接

img

算法分析

img

索引连接

img

运行实例

img

算法分析

  • 分为聚簇和非聚簇的情况

  • 找每个元组T(R)能与T(R)连接的元组的IO次数(聚簇直接按块算,非聚簇按照元组算)

img

查询执⾏模型:物化、流⽔线

img

物化执行

  • 用临时关系存储每个操作

  • 操作全部执行完才下一个操作

img

 

img

流水线执行

  • 前一个操作的结果直接作为下一个操作的输入

  • 操作一有结果就下一个操作,不用等

img

 

流水线执行实例

img

 

img

 

img

迭代器模型

img

 

img

 

img

第10章:查询优化

 

要求准确掌握基本概念熟练进⾏关系代数表达式的等价变换、选择下推、投影下推来产⽣逻辑查询计划熟练估计逻辑查询计划的代价熟练分析物理查询计划的I/O代价

img

逻辑查询优化

  • 代价估算

  • 基于代价优化

img

 

img

 

逻辑查询计划:

查询表达式连接树

  • 连接树(左深连接树、右深连接树、浓密树)

连接顺序的优化

img

 

连接关系的角色

  • 左关系和右关系

  • 探测关系和创建关系

  • 外关系和内关系

  • 索引连接时,右关系是索引关系,左关系是构建关系,通过右关系的相关键进行索引

img

连接树

  • 左连接树:只有一个左关系,其余的关系都变成右关系(有利于流水线)

  • 右连接树:只有一个右关系

  • 其它的叫浓密树

img

选择左深连接树的优点
  • 左深连接树少

  • 效率高,可以流水线不用重复读入

img

  • 存的少

img

  • 不用构建中间表,直接输出作为读入即可

img

 

逻辑查询计划枚举:

  • 关系代数表达式的等价变换、选择下推、投影下推

 

img

关系代数表达式的等价变换

  • 看结果是否相同

img

 

img

选择的变换规则

img

 

img

选择下推

  • 提前筛选

  • 但是筛选之后没有索引,可能降低效率

img

 

img

 

img

投影的变换规则

img

 

img

投影下推

  • 可以降低元组的大小,快速连接

  • 但是可能把索引给投影没

img

 

img

基数估计:

  • 选择、投影、去重、连接、集合操作的结果元组数估计⽅法、直⽅图

基数估计定义

img

 

img

 

img

笛卡尔积基数估计

img

 

投影基数估计

img

选择基数估计

  • 利用均匀分布的性质

img

  • 交并非的情况

img

 

二路自然连接的基数估计

img

 

img

 

img

 

img

 

img

 

img

 

img

多路自然连接的基数估计

img

 

img

集合操作的基数估计

img

去重操作的基数估计

img

属性分布的精确近似

img

直方图的分类

img

等宽直方图

img

等高直方图

img

压缩直方图

img

等高和等宽直方图对比

img

基于直方图的基数估计

img

 

img

 

img

代价估计:

 

img

 

img

 

逻辑查询计划的代价估计⽅法

img

实例:基于动态规划的连接顺序优化

img

 

img

 

img

 

img

物理查询优化

img

操作的物理执⾏算法的确定

img

索引扫描+过滤

img

 

img

多索引扫描+求交集

img

 

img

仅使用索引

img

 

img

顺序扫描

img

举例:确定连接操作的物理执行算法

img

一趟连接

img

索引连接

img

归并排序连接

img

哈希连接

img

嵌套循环连接

img

中间结果传递⽅式的确定

img

物化执行

img

流水线执行

img

物理计划生成举例

img

 

img

 

img

 

img

 

img

 

 

posted @ 2022-05-20 02:25  我不是k  阅读(461)  评论(0编辑  收藏  举报