嵌套循环连接算法在上一节中,我们学习了连接和各种类型的连接。在本节中,我们将了解嵌套循环连接算法。 嵌套循环连接是包含一对嵌套for循环的连接。在两个关系上执行嵌套循环连接,即θr和年代,我们使用的算法叫做嵌套循环联接算法。计算过程如下: r⋈θ年代 这里r被称为外部关系s是内部关系连接的。这是因为r的for循环包含了s的for循环。 嵌套循环连接算法我们来讨论一下嵌套循环连接的算法: 对于每个元组tr在r中,对每个元组t开始年代在s中开始test pair (t)rt年代)来测试它们是否满足给定的连接条件?如果测试满足,则加tr。t年代结果;结束内循环结束外循环 在算法中,tr和t年代分别是关系r和关系s的元组。符号tr。t年代元组是通过连接元组的属性值来构造的吗r和t年代。 在算法的帮助下,我们理解了以下几点:
嵌套循环连接算法的代价分析为了分析嵌套循环连接算法的开销,考虑若干对元组为nr* n年代。在这里,nr指定关系r和n中元组的个数年代指定关系s中元组的个数。为了计算开销,对关系s执行一次完整扫描。 最坏情况下的块传输总数= nr* b年代+ br 在最坏情况下所需的查找总数= nr+ br 在这里,b年代和br分别为保存关系r和关系s元组的块的数量。 在最好的情况下,关系r和s都有足够的内存,可以同时放入内存中。因此,每个块只读取一次。因此, 在最佳情况下,块传输总数= br+ b年代。 所需的搜索总数= 2(n)r+ br) 如果给定的任何一个关系完全符合记忆,则必须使用该关系作为内部关系。这是因为我们只会阅读一次内部关系。因此, 在这种情况下,块传输的总数= br+ b年代 所需的搜索总数= 2(n)r+ br) 块嵌套循环连接块嵌套循环连接是嵌套循环连接的一种变体,其中内部关系的每个块与外部关系的每个块配对。块嵌套循环连接在缓冲区大小小到足以将整个关系保存到内存中的情况下节省了主要块访问。它通过基于每个块而不是基于每个元组处理关系来实现这一点。在每对块中,块嵌套循环连接将一个块中的每个元组与另一个块中的每个元组配对,以生成所有对元组。它只将满足给定连接条件的元组与结果配对。 块嵌套循环连接算法用于执行块嵌套循环连接的算法称为块嵌套循环连接算法。我们将在这个算法中使用相同的关系r和s。 对于每个block brr开始于每个块b年代对于每个元组t,都是s开始的r在br是否为每个元组开始年代在b年代开始测试对(trt年代)来确定它们是否通过了给定的连接条件(如果test通过了)r。t年代结果;结束结束结束结束 块嵌套环联接算法的代价分析块嵌套循环连接和嵌套循环连接算法的开销有很大的区别。在块嵌套循环连接的最坏情况下,对于外部关系r中的每个块,内部关系s中的每个块只读取一次。另一方面,对于外部关系r中的每个元组,嵌套循环连接读取内部关系s中的每个元组一次。因此在块嵌套循环连接中, 最坏情况下的块传输总数= br* b年代+ br 请求的总次数= 2 * br 在这里,br和b年代分别为保存给定关系r和s的记录的块的数目。此外,每次扫描s(内部关系)只需要一次寻道,而r(外部关系)每个块需要一次寻道。在最好的情况下,内部关系完全适用于记忆。因此, 在最佳情况下,块传输总数= br+ b年代 所需的搜索总数= 2(n)r+ br) 如果给定的关系r和s都不能完全装入内存,则使用内部关系(即s)作为外部关系是有效的。 改进嵌套环和块嵌套环连接的性能在了解了这两个连接之后,评估了这两个连接的性能可以进一步提高:
下一个话题
查询处理中的选择操作
|