数据库中的连接算法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个键值对。