考虑以下关系模式:
- 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 账户⋈ 存款人) (C) П c-name (σ b-city=“Agra” 树枝⋈ σ b-city=“Agra”⋀ bal<0 账户)⋈ (储户) (D) П c-name (σ b-city=“Agra”⋀ bal<0 账户⋈ 存款人) 答复: (A) 说明:
为了更好地处理记录,我们应该总是在连接之前进行选择,以避免连接时考虑不必要的元组。(对于SQL查询,这不是严格要求的,因为DBMS会重新安排查询以提高效率),处理较小的表比处理较大的表效率更高。
选项(A) :Пc-name(σbal<0(σb-city=“Agra”分支)⋈ 账户)⋈ 在这里,我们在相对较小的表(分支)和较大的表(帐户)之间进行连接,这个内部表给出的输出(与我们在B中进行的连接相比更小)用于连接具有选择条件的存款表。(与给定查询相同)。 选项(B) :Пc-name(σb-city=“Agra”分支机构⋈ (σbal<0)⋈ 这里我们在两个大型表帐户和具有选择条件(余额小于零)的储户之间进行连接,这个内部表给出的输出用于连接具有选择条件(对于城市Agra)的分支表(相对较小的表)。(与给定查询相同)因此选项A和选项B都与给定查询相同,但记录处理之间存在差异,因为选项A的记录处理将以某种速率减少。(因为过滤条件是在一个较小的表和一个较大的表之间的联接之后应用的,这将给出比两个较大表的联接相对较小的表)。因此,总体而言,方案A比方案B好得多。 选项(C) :Пc-name((σb-city=“Agra”分支机构)⋈ σb-city=“Agra”存款人)不正确,因为a-Schema中没有b-city列。 选项(D) :Пc-name(σb-city=“Agra”分支机构⋈ (σb-city=“Agra”存款人) 不正确,因为a-Schema中没有b-city列。 ⋀ 余额<0账户)⋈ ⋀ 余额<0账户⋈ 注意:不要错过这句话“账户和储户关系比分行关系大得多”,因为这是最好的答案。 这个解决方案是由 尼蒂卡·班萨尔 . 这个问题的小测验