逻辑查询计划
Parsing 解析
将SQL解析成解析树
转换为关系代数表达式
改进关系代数表达式
改进原来的关系代数,使得结果相同,但代价变低
改进规则
- 自然连接、笛卡尔积、并满足交换律、结合律
C:R和S中相同的属性
L:去掉R和S笛卡尔积后重复的列
其中,p条件只与R有关,q条件只与S有关
物理查询计划
中间代价估算
有利于决定后续如何从物理上查询
查询方法
- 基于排序的方法
- 基于哈希的方法
- 基于索引的方法
不同代价的扫描方式
- one-pass 扫一遍
- two-pss 扫两遍(一个存不下)
- multi-pass 扫很多遍
主要估算磁盘I/O代价:扫描多少块
- M:预计能存多少磁盘块
- T(R):R中的元组数量
- B(R):存储R中的元组需要的块数量
- V(R,A):R中A属性的值去重后的数量
注意,我们只能估算,不能得出准确值
基于索引的查询
- 非聚簇存储:,特别地,当A是主键时,代价为1
- 聚簇存储:
natural join
R与S自然连接:将小表S存入内存,把大表R的内容一块一块读进内存,找到能够自然连接的元组,因此将R和S表各扫一遍即可,其代价为
nested-loop join
改进
- 将小表S中的M-1块存入内存
- 把大表R的内容一块一块读进内存
- 对于R表中的每个块,找到能够自然连接的元组
- 其代价为
基于排序的自然连接:归并排序
- 分别读入数据块,对其进行排序,得到几个排好序的子表
- 将子表按照其最小元素排序的顺序读入子表,合并后输出
- 读取两表中最小的数据块,比较相同属性的取值,找到相同取值x,把两表中该属性取值为x的元组都读入内存,并进行连接
- 其代价为
- 但该算法有限制,
选择最好的物理查询计划
关系代数具体到物理层面应该如何执行?需要考虑有无索引、磁盘内数据如何存储等