我如何找到关系代数查询所需的磁盘访问次数?

How can i find the number of disk accesses needed for a relational algebra query?

你好,你们中有没有人能向我解释一下关系代数中查询优化的概念?

我首选的构建关系代数查询的方法是逐步使用临时值,但我能找到的唯一资源是解释查询优化如何工作以找到所需的磁盘访问量,对关系代数查询使用不同的表示法,这让我很困惑。

所以如果我得到以下关系:

部门(部门编号,部门名称,位置)

员工(empNo,empName,empAddress,jobDesc,deptNo*)

并生成了以下关系代数查询,以查找在曼彻斯特部门工作的所有程序员:

temp1 = 部门 JOIN 员工

temp 2 = SELECT(jobdesc = 'programmer') (temp1)

result = SELECT(location = 'Manchester)(temp 2)

而且我可以假设员工关系中有 10,00 个元组,部门关系中有 50 个元组,100 个程序员(每个部门 2 个)和一个位于曼彻斯特的部门,我如何算出有多少需要磁盘访问?

提前致谢!

是的 - 戈登是对的。但是,这是一项学术练习:您正在构建数据集 - 假设子查询返回的每个 element/tuple 都是一次磁盘访问。一般经验法则 - 尽早限制最大数据量。假设您首先执行 JOIN(10000 名员工 + 50 个部门 = 10050 个磁盘条目{即使他返回的行数是 10000!}),然后执行 SELECT(假设子查询已完美索引) = (100 个程序员 + 曼彻斯特的 1 个部门) 因此总数 "accesses" = 10050+101 = 10151.

如果你先做 SELECTS,整个练习会发生巨大变化:(temp 1=get programmers = 100 rows/disk accesses), (temp 2=get departments = 1 row/disk access),JOIN(再次假设在临时 views/queries 等上完美索引)= 50 行:因此 "accesses" 的总数 = 100+1+50 = 151.

结果相同,但解释和执行的方式会影响数据库引擎必须执行的工作量。

已经很多年了,每一次我都可能弄错了 - 我不介意被纠正。