📅  最后修改于: 2020-12-13 05:16:24             🧑  作者: Mango
在上一节中,我们了解了联接和各种类型的联接。在本节中,我们将了解嵌套循环连接算法。
嵌套循环联接是包含一对嵌套的for循环的联接。为了对两个关系r和s执行嵌套循环连接,即θ,我们使用一种称为嵌套循环连接算法的算法。计算过程如下:
[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作为外部关系是有效的。
在了解了两个连接之后,我们评估了两个连接的性能可以进一步提高: