计算块嵌套循环连接的开销

时间:2012-11-22 21:58:13

标签: mysql sql database

我试图根据NDPR(磁盘页面读取次数)计算(最有效的)块嵌套循环连接的开销。假设您有一个表单查询:

SELECT COUNT(*)
FROM county JOIN mcd
ON count.state_code = mcd.state_code
AND county.fips_code = mcd.fips_code
WHERE county.state_code = @NO

其中@NO代替每次执行查询时的状态代码。

我知道我可以使用NPDR(R x S) = |Pages(R)| + Pages(R) / B - 2 . |P ages(S)|

派生NPDR

(其中较小的表用作外部以便产生较少的页面读取.Ergo: R =县,S = mcd)。

我也知道页面大小= 2048字节

Pointer = 8 byte
Num. rows in mcd table = 35298
Num. rows in county table = 3141
Free memory buffer pages B = 100
Pages(X) = (rowsize)(numrows) / pagesize

我想弄清楚“WHERE county.state_code = @NO”如何影响我的费用?

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

首先关于你所写的公式的几点意见:

  • 我不确定你为什么写“B-2”而不是“B-1”。从理论角度来看,您需要一个缓冲页来读取关系S(您可以通过一次读取一页来实现)。

  • 确保使用所有括号。我会把公式写成:
     NPDR(R x S) = |Pages(R)| + |Pages(R)| / (B-2) * |Pages(S)|

  • 公式中的所有数字都需要四舍五入(但这是挑剔)。

  • 通用BNLJ公式的解释:

    • 你从较小的关系(R)中读入尽可能多的元组,因为你可以保留在内存中(B-1或B-2页面的元组值)。

    • 对于每组价值为元组的B-2页,您必须阅读整个S关系(| Pages(S)|)以执行该特定关系范围R的连接。

    • 在连接结束时,关系R只读取一次,关系S读取的次数与填充内存缓冲区的次数相同,即|Pages(R)| / (B-2)次。

现在回答:

  • 在您的示例中,选择条件应用于关系R(在本例中为表国家/地区)。这是查询的WHERE county.state_code = @NO部分。因此,通用公式不直接适用。

  • 当从关系R(即您的示例中的表Country)读取时,我们可以丢弃与选择条件不匹配的所有非限定元组。假设美国有50个州并且所有州都有相同数量的县,表国家中只有2%的元组平均有资格并且需要存储在内存中。这减少了连接的内环的迭代次数(即,我们需要扫描关系S / table mcs的次数)。 2%的数字显然只是预期的平均数,并将根据实际给定的状态而变化。

  • 因此,您的问题的公式变为:
     NPDR(R x S) = |Pages(County)| + |Pages(County)| / (B - 2) * |Counties in state @NO| / |Rows in table County| * |Pages(Mcd)|

相关问题