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