数据库系统
一趟扫描算法
查询算法概述
sql语句->关系代数表达式->基本操作(交并差乘投影)
优化:合适的基本操作执行顺序(逻辑顺序优化),
合适的基本操作实现(物理查询计划)
三大类操作:一次单一元组(记录)的一元操作:投影选择 迭代器算法
整个关系(表)的一元操作:分组排序去重复等 一/两/多趟扫描
整个关系的二元操作:交并连接
连接操作的实现
逻辑算法实现:2重循环
物理算法实现:
考虑磁盘到内存的IO操作的费时性,特别考虑降低IO行为
复杂度:只考虑IO操作的读取块次数
应用条件:需要的内存页的最小个数
基本实现:两重循环读取块,3块内存即可
全主存实现:全部块都载入内存
半主存实现:某个关系全部载入,另一个每次读一块
大关系实现:将一个关系分成多组读入,令一个关系每次读入一块
迭代器
查询策略:
物化计算策略:每次对所有记录进行一步操作,保留每一个中间结果,一个关系 操作扫描一遍数据库
流水线计算策略:使用迭代器进行一系列操作,一组关系操作扫描一遍数据库
迭代器:每次读取下一条记录的类
Open
GetNext
Close
使用迭代器完成对单一元组的一元操作
一趟扫描算法:内存数据结构保存所有记录
表数据读取进内存
聚簇关系存放:磁盘块连续存放
表空间扫描:B(R)存储块数目
排序表空间扫描:载入时且排序,扫描结果排序3B(R)
非聚簇:
表空间:T(R)存储元组数目最坏情况每个元组都在不同的块
排序表空间:T(R)+2B(R)
一元操作
去重复:
建立内存数据结构(有序表,散列等),来保存之前处理过的数据,以便快速处理整个关系
分组:
保存所有分组的聚集信息(散列等)
二元操作
基于集合的:去重复判断
基于包的:统计次数
连接操作:可以用散列函数快速连接
基于索引的选择和连接算法
选择:先利用索引做选择减少IO操作,不在需要载入所有数据块
连接:两个关系都有属性Y的B+树稠密索引,zigzag双指针在两树叶子上
向后移动快速判断是否能够连接