数据库系统 ##两趟扫描算法

本文介绍数据库系统中两趟扫描算法的基本原理与应用场景,包括基于排序和基于散列的两趟扫描方法,以及它们在去重复、分组、并交差和连接等操作中的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库系统

两趟扫描算法

概述

整个关系的一元操作:去重复/分组/排序
内存不够保存所有数据块时需要两趟/多趟算法
第一趟:划分子集,每一个子集具有某种特性
第二趟:多个子集间的归并等
全集上的操作到子集上的操作:基于散列/基于排序

两阶段多路归并排序算法TPMMS

内排序:待排数据能够一次装入内存,常用
外排序:内存不够用时
    1划分成多个可以载入内存的子集块,处理子集块后写回磁盘
    2子集块间作归并,对每个子集块的前一部分都载入内存完成多路归并,输出结果及时写回磁盘
两趟:
    复杂度:3B(R),考虑最终写回4B(R)
    应用条件:数据集块数<内存块数平方
多趟:
    划分多个子块,分别操作
    归并时无法使得每个子集块的一部分都载入
    解决:归并时多阶段每次依次归并部分子集块,减少子集块数目,直到变成两路试完成所有归并

基于排序的两趟扫描

去重复:归并时,在排序基础上直接判断重复
分组:归并时,重复的必然连续出现,分组输出或作聚集计算
包并:一趟不需要去重复
集合并:两趟,需要去重复
包交:两趟
集合交:两趟
包差:两趟
集合差:两趟
注意归并时注意是哪个关系的输入
连接:两趟

基于散列的两趟扫描

基本思想
先按照散列函数分成多个子集(每个子集有多块)并写入磁盘,可能相同的记录存于一个子集:一趟
对每个子集在按照另一个散列函数装入内存:一趟
去重复操作
散列函数1:部分属性,做可能重复子集分组
散列函数2:全部属性,重复时发生冲突
子集中不重复则全集上不重复
复杂度:3B(R)
分组计算
散列函数1:分组属性,确保同一分组一定在一个子集中,但一个子集可能有多个分组
散列函数2:分组属性另一种形式,确保同一分组一定发生冲突
大致分组->精确分组
复杂度:3B(R)
并交差
1.两个数据集以相同的散列分成子集
2.先将数据集R的一个子集散列进内存,对数据集S的相应子集的每一块
依次散列入内存,完成判断
连接
1.以连接属性设计散列函数,分成多个子集
2.两个数据集的相同编号的子集才有可能出现连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值