考虑以下关系模式:
- b-Schema = (b-name, b-city, assets)
- a-Schema = (a-num, b-name, bal)
- d-Schema = (c-name, a-number)
让 branch、account 和 depositor 分别是上述模式的实例。假设账户和存款人关系比分行关系大得多。
考虑以下查询:
П c-name (σ b-city = “Agra” ⋀ bal < 0 (分行⋈(账户⋈存款人)
以下哪个查询是上述查询的最有效版本?
(A) П c-name (σ bal < 0 (σ b-city = “Agra”分行⋈账户) ⋈存款人)
(B) П c-name (σ b-city = “Agra”支行⋈ (σ bal < 0 account ⋈ depositor))
(C) П c-name (σ b-city = “Agra”分支⋈ σ b-city = “Agra” ⋀ bal < 0 account) ⋈存款人)
(D) П c-name (σ b-city = “Agra” ⋀ bal < 0 account ⋈ depositor))答案:(一)
解释:
为了更好地处理记录,我们应该总是在加入之前进行选择,以避免考虑加入不必要的元组。(对于 SQL 查询,这不是严格要求的,因为 DBMS 会重新排列查询以使其高效)并且处理较小的表可以提供更高的效率比更大的。
选项 (A) : П c-name (σ bal < 0 (σ b-city = “Agra” branch ⋈ account) ⋈ depositor)这里我们在相对较小的表(分支)和较大的表(账户)之间进行连接,并且这个内部表给出的输出(与我们在 B 中进行的连接相比更小)用于连接具有选择条件的存款人表。(与给定的查询相同)。
选项(B) : П c-name (σ b-city = “Agra” branch ⋈ (σ bal < 0 account ⋈ depositor)) 这里我们在两个海量表账户和带选择条件的存款人之间进行连接(余额更少大于零)并且该内部表给出的输出用于与具有选择条件(对于城市阿格拉)的分支表(相对较小的表)连接。 (与给定的查询相同)所以选项 A 和选项 B 都与给定的查询相同,但记录处理之间存在差异,因为选项 A 的记录处理会以一定的速度减少。 (因为过滤条件是在一个较小的表和一个较大的表之间的连接之后应用的,这将提供比两个较大表的连接相对较小的表)。因此,总体而言,选项 A 比选项 B 好得多。
选项 (C) : П c-name ((σ b-city = “Agra” branch ⋈ σ b-city = “Agra” depositor) 不正确,因为 a-Schema 中没有 b-city 列。
选项(D) : П c-name (σ b-city = “Agra” 分支⋈ (σ b-city = “Agra”存款人))
不正确,因为 a-Schema 中没有 b-city 列。
⋀ bal < 0 帐号) ⋈
⋀ bal < 0 账号 ⋈
注意:不要错过这句话“账户和存款人的关系比分行关系大得多”,因为这使A成为最佳答案。
该解决方案由Nitika Bansal 提供。
这个问题的测验