给定关系:
Sailors (sid: integer, sname: string, rating: integer, age: real)
Reserves (sid: integer, bid: integer, day: dates, rname: string)
查询
SELECT *
FROM Reserves R, Sailors S
WHERE R.sid=S.sid
假设:
M pages of R, pR tuples per page (i.e., number of tuples of R = M * pR)
N pages of S, pS tuples per page (i.e., number of tuples of S = N * pS)
成本是I / O的数量(忽略输出成本)
查询算法
foreach tuple r in R do
foreach tuple s in S do
if ri == sj then add <r, s> to result
费用
Scan of outer + for each tuple of outer, scan of inner relation.
Cost = M + pR * M * N I/Os
我对成本的最终结果感到困惑。如果我们要扫描R中的每个元组然后扫描每个r,那么扫描S中的每个元组,那么最终的成本是不是R*S = M*pR*N*pS
? (R = M * pR,S = N * pS)。我不确定为什么会有一个附加符号。 I / O仅占帐户页面吗?而不是记录?
答案 0 :(得分:1)
你给自己正确的答案:
I / O是否只占网页?而不是记录?
这些情况下的成本是以磁盘访问的数量计算的。 I / O操作将整个页面而不是记录从磁盘传输到主存储器,反之亦然(这正是页面的含义:两个存储器之间的最小传输单位)。
因此,由于嵌套循环算法仅读取关系R
一次,因此第一项等于读取它的I / O操作数,等于其页数。