数据库系统
两趟扫描算法
概述
整个关系的一元操作:去重复/分组/排序
内存不够保存所有数据块时需要两趟/多趟算法
第一趟:划分子集,每一个子集具有某种特性
第二趟:多个子集间的归并等
全集上的操作到子集上的操作:基于散列/基于排序
两阶段多路归并排序算法TPMMS
内排序:待排数据能够一次装入内存,常用
外排序:内存不够用时
1划分成多个可以载入内存的子集块,处理子集块后写回磁盘
2子集块间作归并,对每个子集块的前一部分都载入内存完成多路归并,输出结果及时写回磁盘
两趟:
复杂度:3B(R),考虑最终写回4B(R)
应用条件:数据集块数<内存块数平方
多趟:
划分多个子块,分别操作
归并时无法使得每个子集块的一部分都载入
解决:归并时多阶段每次依次归并部分子集块,减少子集块数目,直到变成两路试完成所有归并
基于排序的两趟扫描
去重复:归并时,在排序基础上直接判断重复
分组:归并时,重复的必然连续出现,分组输出或作聚集计算
包并:一趟不需要去重复
集合并:两趟,需要去重复
包交:两趟
集合交:两趟
包差:两趟
集合差:两趟
注意归并时注意是哪个关系的输入
连接:两趟
基于散列的两趟扫描
基本思想
先按照散列函数分成多个子集(每个子集有多块)并写入磁盘,可能相同的记录存于一个子集:一趟
对每个子集在按照另一个散列函数装入内存:一趟
去重复操作
散列函数1:部分属性,做可能重复子集分组
散列函数2:全部属性,重复时发生冲突
子集中不重复则全集上不重复
复杂度:3B(R)
分组计算
散列函数1:分组属性,确保同一分组一定在一个子集中,但一个子集可能有多个分组
散列函数2:分组属性另一种形式,确保同一分组一定发生冲突
大致分组->精确分组
复杂度:3B(R)
并交差
1.两个数据集以相同的散列分成子集
2.先将数据集R的一个子集散列进内存,对数据集S的相应子集的每一块
依次散列入内存,完成判断
连接
1.以连接属性设计散列函数,分成多个子集
2.两个数据集的相同编号的子集才有可能出现连接