📜  在数据库中加入算法

📅  最后修改于: 2021-09-28 10:02:20             🧑  作者: Mango

有两种算法可以计算数据库中 2 个关系的自然连接和条件连接:嵌套循环连接和块嵌套循环连接。

为了理解这些算法,我们假设有两个关系,关系 R 和关系 S。关系 R 有 T R元组并占据 B R块。关系 S 有 T S元组并占据 B S块。我们还将假设关系 R 是外部关系,S 是内部关系。

1. 嵌套循环加入:
在嵌套循环连接算法中,对于外关系中的每个元组,我们必须将其与内关系中的所有元组进行比较,然后只考虑外关系的下一个元组。满足条件的所有元组对都添加到连接的结果中。

for each tuple tR in TR do
 for each tuple ts in Ts do
  compare (tR, ts) if they satisfies the condition
  add them in the result of the join
 end 
end

该算法称为嵌套连接,因为它由嵌套的 for 循环组成。

让我们看一些案例来了解这个算法的性能,

  • 案例 1:假设只有两个主要内存块可用于存储来自 R 和 S 关系的块。

    对于关系 R 中的每个元组,我们必须传输关系 S 的所有块,并且关系 R 的每个块应该只传输一次。
    因此,所需的总块传输 = T R * B S + B R

  • 案例 2:假设一个关系完全适合主内存,并且至少有一个额外块的空间。

    在这种情况下,关系S的块(即内部关系)只传输一次并保存在主存储器中,关系R的块依次传输。因此,两个关系的所有块都只传输一次。
    因此,所需的总块传输 = B R + B S

块数较少的关系应该是内部关系,以最小化主内存中完成连接所需的块总数。
也就是说,min(B R , B S )+1 是连接两个关系所需的主存储器中的最小块数,以便没有块被传输超过一次。

在嵌套循环连接中,如果分配给连接的主内存空间非常有限,则连接关系需要更多的访问成本。

2.块嵌套循环加入:
在块嵌套循环连接中,对于一个外部关系块,将该块中的所有元组与内部关系的所有元组进行比较,然后只考虑下一个外部关系块。满足条件的所有元组对都添加到连接的结果中。

for each block bR in BR do
 for each block bs in BS do
  for each tuple tR in TR do
   for each tuple ts in Ts do
    compare (tR, ts) if they satisfies the condition
    add them in the result of the join
   end
  end 
 end
end 

让我们看一些与嵌套循环连接类似的情况,

  • 案例 1:假设只有两个主要内存块可用于存储来自 R 和 S 关系的块。

    对于关系 R 的每个块,我们必须转移关系 S 的所有块,并且关系 R 的每个块应该只转移一次。
    因此,所需的总块传输 = B R + B R * B S

  • 案例 2:假设一个关系完全适合主内存,并且至少有一个额外块的空间。

    在这种情况下,所需的总块传输类似于嵌套循环连接。
    如果分配给连接的主内存空间有限,则块嵌套循环连接算法与嵌套循环连接相比降低了访问成本。

相关的 GATE 问题:

  • 门 IT 2005 |第 84 题
  • 门 IT 2005 |第 85 题