【高级数据库】第三章 查询执行

【高级数据库】第三章 查询执行

  第二章主要讲解如何在文件上添加索引来提高操作效率。第三章和第四章将主要讲解查询的实现细节。

第01讲 查询计划

1、查询编译预览

  查询编译执行可分为三个步骤:
(1)分析:建立查询的分析树;
(2)查询重写:分析树被转化为初始查询计划,通常是查询的代数表达式;然后初始查询计划被转化为一个预期所需执行时间最小的等价的计划;
(3)物理计划生成:根据上一步的抽象的查询计划,对每一个字符选择实现算法,并选择这些操作符的执行顺序,将逻辑查询计划转化为物理查询计划。物理计划用表达树表示。
  操作符的划分:
(1)一次单个元组(一元操作):例如选择和投影不需要一次在内存中装入整个关系;
(2)整个关系(一元操作):需要一次性从内存中看到所有或大部分元组,例如分组操作和去重操作;
(3)整个关系(二元操作):例如并、交、差、连接和积;

2、物理查询计划

2.1 扫描表:

  查询整个表操作,读取关系R中满足指定谓词的元组,包含两种方法:
(1)表-扫描:根据元组存放的块,系统一个一个获取这些块;
(2)索引-扫描:若R上任意一个属性有索引,则可以使用索引得到所有元组;
  当扫描表时需要排序时(ORDER BY),采用物理查询计划操作符“排序-扫描”,实现方法:先用表扫描或索引扫描获得所有元组,然后在内存(或外存)进行排序;

2.2 操作符I/O代价

  表达操作符代价的参数(统计数据):
(1)描述一个关系R的大小时,关系R所有元组所需要的块的数目,表示 B ( R ) B(R) ,简单描述为 B B 。假设R是聚集的,即R存储在 B B 个块中。
(2)描述一个关系R的大小时,关系R所有元组的数目,表示为 T ( R ) T(R) 简单描述为 T T ,一个块中可以容纳的元组数则为 B / T B/T
(3)对于关系R的某一个属性a,属性a对应不同取值的数目,表示为 V ( R , a ) V(R, a)
  操作I/O代价:
(1)表-扫描:如果R是聚集的,I/O代价为 B B ;如果不是聚集的,则代价为 T T
(2)索引——扫描: B B T T

3、一趟算法

3.1 一次单个元组一元操作

在这里插入图片描述

  一次读取R的一块到缓冲区,然后对每个元组进行操作,并将选择/投影操作执行的结果元组移至输出缓冲区。如果R是聚集的,在磁盘读取块时,I/O代价为 B B ,否则为 T T

3.2 整个关系的一元操作

(1)去重:
在这里插入图片描述
从磁盘中读取R的一块,并输入到输入缓冲区,然后遍历所有元组,当当前元组从未出现,则复制到缓冲区中保存副本,若已出现则跳过。每次检查当前元组是否出现均需要扫描副本缓冲区,可设置散列表降低时间开销。

3.3 二元操作

  假设两个关系 R R S S 满足的二元操作,先取其中较小的操作数读入内存中,并为其建立一个合适的数据结构,支持删除和检索(散列表或平衡二叉树)。
在这里插入图片描述
在这里插入图片描述

发布了96 篇原创文章 · 获赞 158 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_36426650/article/details/103394211
今日推荐