📜  双管道联接算法

📅  最后修改于: 2020-12-13 05:18:10             🧑  作者: Mango

双管道联接算法

在上一节中,我们了解了流水线以及系统使用需求驱动或生产者驱动的流水线创建和实现流水线以评估多个操作的方式。

在这里,我们将讨论用于实现流水线的评估算法。

从任何特定系统访问数据时有几种操作。但是其中很少有天生会阻止操作,而其他却不是。阻塞操作是在检查所有输入的元组之前不会输出任何结果的操作。

例如,像散列连接之类的操作是阻塞操作,与输出任何结果之前一样。它需要将其输入全部提取并进行分区。另一方面,索引嵌套循环能够在得到外部关系的元组后立即输出结果元组。因此,它在其外部关系处以流水线形式运行,并在其索引输入上受阻。之所以这样,是因为索引是在执行索引嵌套循环之前完全创建的。

但是在某些情况下,我们想对两个输入执行联接操作。但是,两个输入都尚未排序,因此我们需要将它们放入联接操作的管道中。对于这种情况,我们使用另一种方法,称为双管道联接方法。双管道连接技术使用评估算法来实现管道,这称为双管道连接算法

双流水线加入算法

下面我们描述了双流水线连接算法:

对两个输入关系r和s执行上述算法。假定这些关系的输入元组是流水线的。提供给r和s关系的元组排队等待在一个队列中进行处理。在算法中,End r和End s是特殊队列,它们是文件结束标记。仅在分别从关系r和s生成所有元组之后,才将这些特殊队列插入队列中。另外,随着更多元组被添加到关系r和s中,应该在这两个关系上建立适当的索引。保持索引为最新状态可以对操作进行有效评估。

在该算法中,我们还假定两个输入都适合存储。但是,双流水线连接技术也支持以下情况:两个输入的大小超过内存大小,即大于内存大小。这是因为双管道连接方法可以照常工作,直到可用内存变满为止。当内存已满时,关系r和s到达该点的元组可以分别视为在r 0和s 0分区中。随后到达关系r和s的元组分配给分区r 1和s 1 。尽管分配给分区r 1和s 1的这些元组未包含在内存索引中,但它们已写入磁盘。同样,在将分配给r 1和s 1的这些元组写入磁盘之前,它们将用于探测分区r 0和s 0 。结果,它还在管道中得出r 1与s 0的连接以及s 0与r 1的连接的结论。在完全处理了关系r和s之后,我们计算出r 1个元组与s 1个元组的连接,以完成连接操作。同样,我们可以使用任何联接操作或方法对具有s 1分区的r 1分区执行联接。

注意:如果我们通过在任何关系r和s上使用哈希索引来实现管道,则这种方法称为Double-pipelined哈希联接方法。