我试图根据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)|
(其中较小的表用作外部以便产生较少的页面读取.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
”如何影响我的费用?
感谢您的时间。
答案 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)|