数据库中的连接算法Join的磁盘I/O需求


写在前面:
  最近要考试了,复习期间为了帮自己巩固知识,顺手写下这些,主要是关于数据库在查询过程中各种操作的I/O需求,这篇讲的是join操作,之后有时间也会整理其他的,敬请期待呀~

1 嵌套循环连接Iteration join

——算法如下所示

1.1 基于元组、非聚簇

【读取R1中的一条元组,和R2join。】

100个block可存放的元组数(每个block可放10条元组):

100 * 10 = 1000

每次读取R1的100个block的元组到内存中,读取R2(5000),进行join.
每次读100个block,R1的10000条元组需要读取的次数:

10000 / (100 * 10)

注: 将小的那个R用来读取100个block,会减小一定的I/O数

1.2 基于块、聚簇

每次读R2的100个chunk到内存中,读R1进行join。(这里的一个chunk包含10条元组)

2 基于排序的连接Merge Join

——算法如下所示

2.1 有序、聚簇、基于块

将R1和R2都读入内存中,直接join

2.1 无序、聚簇、基于块

对每个R,先读到内存中,然后每个块内部先排序,输出到磁盘;接着再读入内部排序好的各个块,进行块之间的联合排序,输出到磁盘;最后将排序好的R读到内存中进行Join。即每个R的I/O操作为五次。(包含归并排序内容)

优化:在第二次块间排序同时join,每个R的I/O操作为三次。但对内存有一定的要求。

3 基于索引的连接Index Join

——算法如下所示

3.1 普通Index Join

读R2的block(500) + 对R2的每条元组(5000) * (探索索引 + R1中匹配的元组数)

3.2 部分常驻内存

R1.c的索引有201个block块,将根和99个叶子结点常驻内存,其他101个存在磁盘上。则:

探索索引的I/O操作数E = 常驻内存的结点I/O操作数 * 常驻结点的概率 + 存在磁盘的结点I/O操作数 * 磁盘结点的概率

4 基于哈希的连接Hash Join

——算法如下所示

4.1 普通Hash Join

对每个R,先读到内存中,根据hash函数把元组分配到各个桶中,写回磁盘;然后把桶读会内存,进行join。即每个R的I/O操作为三次。(要求比较小的桶能够放在内存中,且哈希函数选择得够好,桶中的元组数量平均。)

4.2 混合Hash Join

假设有33个桶,则对R1来说,每个桶中有1000/33=31个block。放两个桶G0和G1在内存中不写回磁盘,则写回磁盘的为33-2=31个桶里的元组数,R2类似(R2中被分配到G0和G1的元组直接进行join输出)。最后将写回磁盘的所有桶读入内存进行join。

4.3 键指对Hash Join

在内存中只存放键值对,一个块可以存放100个键值对。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值