一趟扫描算法指的是指的是通过一遍扫描就可以实现指定的数据库操作,比如选择、投影等。而对于整个关系的一元操作例如去重、分组、排序等数据库操作则需要每一个元组与所有元组比较才能确定是否重复、才能知道是否是一个新的元组、才能确定其次序,而这就需要内存。内存不够大、不能放下关系的整个元组,有没有一种解决办法呢?那就需要两趟扫描算法甚至多趟扫秒算法。
两趟扫描算法 第一趟是划分子集,使得子集具有某种特性,如排序或者散列。
第二趟是处理全局性的内容操作,形成结果集。
- 基于排序的两趟扫描算法:
(1)去重复操作:第一阶段划分子表并进行子表排序 第二阶段 归并时确定是否重复,重复元素不输出。 (2)分组操作:第一阶段划分子表并排序 第二阶段 归并时对于重复元组计算分组值,对于不重复的元组,直接作为新元组输出。 (3)并交差:包的并只需一趟 集合的并需要两趟 交操作R交S: 1)集合 :第一趟 R、S划分子表 并排序 ,第二趟归并时若R 和S都有即输出 2)包:第一趟R、S划分子表并排序,第二趟 归并时统计R、S共同出现某一元组的最小次数。 并操作R并S: 1)集合并:第一趟 R、S划分子表并排序 第二趟归并时需要去重复 2)包的并:直接一趟读取。 差操作R - S: 1)集合的差: 第一趟 R、S划分子表并排序 第二趟归并时R中有S中没有的元组 输出 2)包的差:第一趟 R、S划分子表并排序 第二趟归并时输出t的次数是其在R中的次数减去其在S中的次数。 (4)连接操作:第一趟:R、S划分子表并排序 第二趟归并时若两个元组可以连接并且来自不同的关系表则输出。
- 基于散列的两趟扫描算法
(1)去重复操作:首先将一个关系R散列为M-1个内存块当中,若内存块满则写入磁盘,最后表R被分成M-1个子表。然后利用之前的一趟算法的去重操作接口完成大表的去重操作。
(2) 分组操作:首先按照分组属性将关系表R散列为M-1个桶中,最后结果就是关系表R分为M-1个子表
这时候再依次处理每个子表,利用之前的一趟扫描算法。
(3)集合和包的 并交差:首相将R、S表按照相同的散列函数各散列为M-1个子表。然后通过对Si Ri 的操作即可得到整个表的结果。