📜  嵌套循环联接算法

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

嵌套循环联接算法

在上一节中,我们了解了联接和各种类型的联接。在本节中,我们将了解嵌套循环连接算法。

嵌套循环联接是包含一对嵌套的for循环的联接。为了对两个关系rs执行嵌套循环连接,即θ,我们使用一种称为嵌套循环连接算法的算法。计算过程如下:

[R⋈θ小号

其中r被称为外部关系,而s是联接的内部关系。这是因为r的for循环包围了s的for循环。

嵌套循环联接算法

让我们讨论嵌套循环连接的算法:

在该算法中,t r和t s分别是关系r和s的元组。符号t r 。 t s是通过合并元组t r和t s的属性值构造的元组。

借助该算法,我们了解了以下几点:

  • 嵌套循环联接不需要任何类似于线性文件扫描的索引来访问数据。
  • 嵌套循环联接不关心给定的联接条件。它适用于每个给定的连接条件。
  • 嵌套循环联接算法本质上是昂贵的。这是因为它计算并检查给定两个关系中的每对元组。

嵌套循环联接算法的成本分析

为了分析嵌套循环联接算法的成本,请将多个元组对视为n r * n s 。此处,n r指定关系r中的元组数,n s指定关系s中的元组数。为了计算成本,请对关系s进行完整扫描。从而,

最坏情况下的块传输总数= n r * b s + b r

最坏情况下所需的搜寻总数= n r + b r

在此,b s和b r分别是保持关系r和s的元组的块数。

在最佳情况下,关系r和s都具有足够的内存以同时适合该内存。因此,每个块只能读取一次。从而,

最佳情况下的块传输总数= b r + b s

总搜寻次数= 2(n r + b r )

如果给定的任何一种关系完全适合内存,则必须将该关系用作内部关系。因为我们只读取一次内部关系。从而,

在这种情况下,块传输总数= b r + b s

总搜寻次数= 2(n r + b r )

块嵌套循环联接

块嵌套循环联接是嵌套循环联接的一种变体,其中内部关系的每个块与外部关系的每个块配对。在缓冲区大小足够小以将整个关系保存到内存中的情况下,块嵌套循环联接可节省主要块访问。它通过基于每个块而不是基于每个元组来处理关系来做到这一点。在每对块中,块嵌套循环联接将一个块的每个元组与另一个块中的每个元组配对,以生成所有对的元组。它仅将满足给定连接条件的那些元组配对,并将它们与结果配对。

块嵌套循环连接算法

用于执行块嵌套循环联接的算法称为“块嵌套循环联接”算法。我们将在此算法中使用相同的关系r和s。

块嵌套循环加入算法的成本分析

块嵌套循环连接和嵌套循环连接算法的成本之间存在主要差异。在块嵌套循环联接的最坏情况下,内部关系s中的每个块对于外部关系r中的每个块仅读取一次。另一方面,嵌套循环联接为外部关系r中的每个元组一次读取内部关系s中的每个元组。因此,在块嵌套循环联接中,

最坏情况下的块传输总数= b r * b s + b r

总搜寻次数= 2 * b r

在此,b r和b s分别是保持给定关系r和s的记录的块数。同样,对s(内部关系)的每次扫描仅需要一个搜索,而r(外部关系)则每个块需要一个搜索。在最佳情况下,内部关系完全适合记忆。从而,

最佳情况下的块传输总数= b r + b s

总搜寻次数= 2(n r + b r )

在给定关系r和s都不完全适合内存的情况下,将内部关系即s作为外部关系是有效的。

提高嵌套循环和块嵌套循环联接的性能

在了解了两个连接之后,我们评估了两个连接的性能可以进一步提高:

  • 如果在等值联接或自然联接中,联接属性在给定的内部关系s上形成键,则一旦找到第一个匹配项,内部循环就会为每个外部关系元组终止。
  • 可以在块嵌套循环联接算法中使用磁盘块,而不是使用磁盘块,而可以在内存中使用最大的块,并为内部关系s及其输出的缓冲区保留足够的空间。结果,它将减少内部关系的扫描次数,并使成本最小化。
  • 我们可以交替地在向前和向后方向上执行内循环扫描。通过保持对磁盘块的请求顺序排列,此方法减少了磁盘访问的要求数量。请求的顺序还有助于重用缓冲区中先前扫描后留在缓冲区中的剩余数据。
  • 如果内部循环的join属性上存在索引,则可以用高效的索引查找替换文件扫描。这种连接方法称为索引嵌套循环连接。索引嵌套循环联接可以与现有索引或临时索引一起使用,这些索引是为评估联接而创建的。这是用于提高嵌套循环联接的性能的优化技术。