合并连接算法2024年8月28日 | 阅读 4 分钟 Merge Join 用于对给定的关系 r 和 s 执行自然连接和等值连接。我们使用一种称为Merge Join 算法的算法来执行合并连接。它也被称为Sort-Merge-Join 算法。 合并连接算法Merge Join 算法如下: pr = address of first tuple of relation r; ps = address of first of relation s; while (ps!=null && pr!=null) do begin ts = tuple to which ps points; Ss = {ts}; set ps to point the next tuple of relation s; done = false; while (!done && ps!=null) do begin ts? = tuple to which ps points; if (ts?[JoinAttrs] = ts[JoinAttrs]) begin Ss = Ss U {ts?}; set ps to point the next tuple of relation s; end else done = true; end tr = tuple to which pr points; while (pr !=null && tr [JoinAttrs] < ts[JoinAttrs]) do begin for each ts in Ss do begin add ts ⋈ tr to result; end set pr to point nest tuple of r; tr = tuple to which pr points; end 在算法中,使用了各种术语: JoinAttrs(连接属性):它表示关系r ꓵ s的交集中的属性。 r ꓵ s: r ꓵ s 指的是关系 r 和 s 中共同的属性。 ts ⋈ tr: ts 和 tr 元组属性的连接表达式。在此之后,将投影出重复的属性。 ts 和 tr: 这是两个具有相同 JoinAttrs 值的元组。 Ss: 它读取关系中具有相同值的元组组的那些连接属性。 在 Merge Join 算法中,它将每个关系关联一个指针。最初,指针指向关系的第一个元组,然后随着算法的进行而移向下一个。此外,该算法要求每个元组集 Ss 适合内存,即使关系 s 的大小很大。但是,如果对于某些属性值,Ss 似乎大于可用内存大小,我们可以对其执行块嵌套循环连接。如果给定的输入关系 r 和 s 未按连接属性排序,或者其中一个未排序,我们需要在应用 Merge Join 算法之前对其进行排序。 Merge Join 算法的成本分析如果关系已排序,并且具有连接属性上相同值的元组连续放置。那么我们只需要读取每个元组一次,因此块也将被读取一次。因此, 块传输次数 = br + bs 此外,两个文件中的块传输次数相等。 磁盘寻道次数 = [br/bb] + [bs/bb] 这里,br 和 bs 是给定关系 r 和 s 的块数。术语 bb 表示我们假设为两个关系分配了 bb 个缓冲区块。但是,我们知道数据传输比磁盘寻道便宜,因此我们应该为每个给定的关系分配多个块。因此,它也将提供额外的内存空间。 混合 Merge Join 算法混合 Merge Join 与 Merge Join 不同。在 Merge Join 操作中,我们看到在应用 Merge Join 技术之前必须对给定关系进行排序。但是,如果两个连接属性都包含二级索引,那么我们也可以对未排序的元组执行 Merge Join 操作的变体。为此,应用的 Merge Join 算法将通过索引扫描记录,这将能够以排序的方式检索记录。因此,此类 Merge Join 操作的变体会导致一个明显的缺点,即:
为了避免这种昂贵的访问,我们使用一种称为“混合 Merge Join”的新技术。混合 Merge Join 操作将索引与 Merge Join 相结合。 为了理解混合 Merge Join 操作,让我们举个例子: 假设我们有两个关系,其中一个关系已排序,另一个关系未排序。但是未排序的关系在连接属性上具有二级 B+ 树索引。 在这种情况下,最初,混合 Merge Join 过程将合并或组合已排序的关系与二级 B+ 树索引的叶条目。然后结果文件将包含来自已排序关系的元组以及未排序关系的元组的地址。此外,结果文件将根据未排序关系的元组地址再次排序,以便在物理存储顺序中高效检索相应元组以完成连接。这种方法称为混合 Merge Join 方法。 下一主题嵌套循环连接算法 |
我们请求您订阅我们的新闻通讯以获取最新更新。