数据库 第13章 查询优化

文章目录

Chapter 13: Query Optimization

概述(Introduction)

执行代价

  • 集中式数据库:(磁盘存取块数)IO 代价 + (处理时间)CPU 代价 + (查询的内存开销)内存代价
  • 分布式数据库:IO 代价 + CPU 代价 + 内存代价 + 通信代价

注意:IO 代价是最主要的

一个实例

:求选修了 2 号课程的学生姓名

SELECT Student.Sname
FROM   Student, SC
WHERE  Student.Sno = SC.Sno AND SC.Cno='2'

(假定 Student 数据库中有 1000 个学生记录,10000 条选课记录,其中选修 2 号课程的选课记录为 50 个)

三种查询方式:( × n a t r u a l {\times}_{natrual} ×natrual 代表自然连接)
Q 1 = Π S n a m e ( σ S t u d e n t . S n o = S C . S n o ∧ S C . C n o = ′ 2 ′ ( S t u d e n t × S C ) ) Q_1={\Pi}_{Sname}({\sigma}_{Student.Sno=SC.Sno{\wedge}SC.Cno='2'}(Student{\times}SC)) Q1=ΠSname(σStudent.Sno=SC.SnoSC.Cno=2(Student×SC))

Q 2 = Π S n a m e ( σ S C . C n o = ′ 2 ′ ( S t u d e n t × n a t r u a l S C ) ) Q_2={\Pi}_{Sname}({\sigma}_{SC.Cno='2'}(Student{\times}_{natrual}SC)) Q2=ΠSname(σSC.Cno=2(Student×natrualSC))

Q 3 = Π S n a m e ( S t u d e n t × n a t r u a l σ S C . C n o = ′ 2 ′ ( S C ) ) Q_3={\Pi}_{Sname}(Student{\times}_{natrual}{\sigma}_{SC.Cno='2'}(SC)) Q3=ΠSname(Student×natrualσSC.Cno=2(SC))

Q 1 = Π S n a m e ( σ S t u d e n t . S n o = S C . S n o ∧ S C . C n o = ′ 2 ′ ( S t u d e n t × S C ) ) Q_1={\Pi}_{Sname}({\sigma}_{Student.Sno=SC.Sno{\wedge}SC.Cno='2'}(Student{\times}SC)) Q1=ΠSname(σStudent.Sno=SC.SnoSC.Cno=2(Student×SC))
Step 1:计算广义笛卡尔积

① 在内存中尽可能多地装入某个表(如 Student 表)的若干块,留出一块存放另一个表(如 SC 表)的元组

② 把 SC 中的每个元组和 Student 中每个元组连接,连接后的元组装满一块后写到中间文件上

③ 从 SC 中读入一块和内存中的 Student 元组连接,直到 SC 表处理完

④ 再读入若干块 Student 元组,读入一块 SC 元组,重复 ② - ③,直到把 Student 表处理完

代价

读:设一个块能装 10 个 Student 元组或 100 个 SC 元组,在内存中存放 5 块 Student 元组和 1 块 SC 元组,则读取总块数为:(块)
1000 10 + 1000 10 × 5 × 10000 100 = 2100 \frac{1000}{10}+\frac{1000}{10{\times}5}\times\frac{10000}{100}=2100 101000+10×51000×10010000=2100
写:连接后的元组数为 1 0 3 × 1 0 4 = 1 0 7 10^3{\times}10^4=10^7 103×104=107,设每块能装 10 个元组,则写出 1 0 6 10^6 106 块(到磁盘)

Step 2:选择操作

忽略内存处理时间,读取文件花费的时间(通写中间文件一样),需读入 1 0 6 10^6 106 块(从磁盘)

满足条件的元组仅 50 个,均可放在内存

Step 3:投影操作

把 Step 2 的结果再 Sname 上作投影输出,得到最终结果

总代价:

Q 1 Q_1 Q1 的查询方法总读写数据块 = 2100 + 1 0 6 + 1 0 6 =2100+10^6+10^6 =2100+106+106

Q 2 = Π S n a m e ( σ S C . C n o = ′ 2 ′ ( S t u d e n t × n a t r u a l S C ) ) Q_2={\Pi}_{Sname}({\sigma}_{SC.Cno='2'}(Student{\times}_{natrual}SC)) Q2=ΠSname(σSC.Cno=2(Student×natrualSC))
Step 1:计算自然连接

执行自然连接时,读取 Student 和 SC 表的策略不变,总的读取块仍为 2100 块

自然连接的结果比 Q 1 Q_1 Q1 大大减少,为 1 0 4 10^4 104 个元组,即写出数据块为 1 0 3 10^3 103

Step 2:选择操作

读取中间文件块,执行选择运算,读取数据块为 1 0 3 10^3 103

Step 3:投影操作

把 Step 2 的结果再 Sname 上作投影输出,得到最终结果

总代价:

Q 2 Q_2 Q2 的查询方法总读写数据块 = 2100 + 1 0 3 + 1 0 3 =2100+10^3+10^3 =2100+103+103

Q 3 = Π S n a m e ( S t u d e n t × n a t r u a l σ S C . C n o = ′ 2 ′ ( S C ) ) Q_3={\Pi}_{Sname}(Student{\times}_{natrual}{\sigma}_{SC.Cno='2'}(SC)) Q3=ΠSname(Student×natrualσSC.Cno=2(SC))
Step 1:选择操作

先对 SC 表作选择运算,只需读一遍 SC 表,存取 100 块;

最终满足条件的元组仅有 50 条,所以不必使用中间文件

Step 2:计算自然连接

把读入的 Student 元组和内存中的 SC 元组作连接,只需读一遍 Student 表共 100 块

Step 3:投影操作

把 Step 2 的结果再 Sname 上作投影输出,得到最终结果

总代价:

Q 3 Q_3 Q3 的查询方法总的读写块 = 100 + 100 =100+100 =100+100

④ 其他情况
假如 SC 表的 Cno 字段上有索引

对于 Q 3 Q_3 Q3 ,第一步就可以简化成只读取 Cno = ‘2’ 的 50 条元组;

存取的索引块和 SC 中满足条件的数据块大约总共 3~4 块

假如 Student 表的 Sno 字段上有索引

不必读取所有的 Student 元组,因为满足条件的 SC 记录仅有 50 个,涉及最多 50 个 Student 记录

⑤ 总结

将表达式 Q 1 Q_1 Q1 变换为 Q 2 Q_2 Q2 再变为 Q 3 Q_3 Q3 ,开销大大减少;

结论:有选择和连接操作时,先做选择操作。这样参加连接的元组就可以大大减少,叫做 代数优化

关系表达式的转化(Transformation of Relational Expressions)

等价规则(equivalence rule)

关系代数表达式的等价:指用相同的关系代替两个表达式中相应的关系所得到的结果时相同的

常用的等价变换规则
① 连接、笛卡尔积交换律

E 1 E_1 E1 E 2 E_2 E2 是关系代数表达式, F F F 是连接运算的条件,则有:

  • E 1 × E 2 ≡ E 2 × E 1 E_1{\times}E_2{\equiv}E_2{\times}E_1 E1×E2E2×E1
  • E 1 × n a t r u a l E 2 ≡ E 2 × n a t r u a l E 1 E_1{\times}_{natrual}E_2{\equiv}E_2{\times}_{natrual}E_1 E1×natrualE2E2×natrualE1
  • E 1 × F n a t r u a l E 2 ≡ E 2 × F n a t r u a l E 1 E_1{\times}_{F}^{natrual}E_2{\equiv}E_2{\times}_{F}^{natrual}E_1 E1×FnatrualE2E2×FnatrualE1
② 连接、笛卡尔积结合律

E 1 E_1 E1 E 2 E_2 E2 E 3 E_3 E3 是关系代数表达式, F 1 F_1 F1 F 2 F_2 F2 是连接运算的条件,则有:

  • ( E 1 × E 2 ) × E 3 ≡ E 1 × ( E 2 × E 3 ) (E_1{\times}E_2){\times}E_3{\equiv}E_1{\times}(E_2{\times}E_3) (E1×E2)×E3E1×(E2×E3)

  • ( E 1 × n a t r u a l E 2 ) × n a t r u a l E 3 ≡ E 1 × n a t r u a l ( E 2 × n a t r u a l E 3 ) (E_1{\times}_{natrual}E_2){\times}_{natrual}E_3{\equiv}E_1{\times}_{natrual}(E_2{\times}_{natrual}E_3) (E1×natrualE2)×natrualE3E1×natrual(E2×natrualE3)

  • ( E 1 × F 1 n a t r u a l E 2 ) × F 2 n a t r u a l E 3 ≡ E 1 × F 1 n a t r u a l ( E 2 × F 2 n a t r u a l E 3 ) (E_1{\times}_{F_1}^{natrual}E_2){\times}_{F_2}^{natrual}E_3{\equiv}E_1{\times}_{F_1}^{natrual}(E_2{\times}_{F_2}^{natrual}E_3) (E1×F1natrualE2)×F2natrualE3E1×F1natrual(E2×F2natrualE3)

③ 投影的串接定律

Π A 1 , A 2 , . . . A n ( Π B 1 , B 2 , . . . B m ( E ) ) ≡ Π A 1 , A 2 , . . . A n ( E ) {\Pi}_{A_1,A_2,...A_n}({\Pi}_{B_1,B_2,...B_m}(E)){\equiv}{\Pi}_{A_1,A_2,...A_n}(E) ΠA1,A2,...An(ΠB1,B2,...Bm(E))ΠA1,A2,...An(E) ,其中:

  • E E E 是关系代数表达式
  • A i ( i = 1 , 2... n ) A_i(i=1,2...n) Ai(i=1,2...n) B i ( i = 1 , 2... m ) B_i(i=1,2...m) Bi(i=1,2...m) 是属性名
  • { A 1 , A 2 , . . . A n } \{A_1,A_2,...A_n\} {A1,A2,...An} 构成 { B 1 , B 2 , . . . B m } \{B_1,B_2,...B_m\} {B1,B2,...Bm} 的子集
④ 选择的串接定理

σ F 1 ( σ F 2 ( E ) ) ≡ σ F 1 ∧ F 2 ( E ) ≡ σ F 2 ( σ F 1 ( E ) ) {\sigma}_{F_1}({\sigma}_{F_2}(E)){\equiv}{\sigma}_{F_1{\wedge}F_2}(E){\equiv}{\sigma}_{F_2}({\sigma}_{F_1}(E)) σF1(σF2(E))σF1F2(E)σF2(σF1(E)) ,其中 E E E 是关系代数表达式, F 1 F_1 F1 F 2 F_2 F2 是选择条件

选择的串接律说明选择条件可以合并,这样一次就可以检查全部条件

⑤ 选择与投影操作的交换律

σ F ( Π A 1 , A 2 , . . . A n ( E ) ) ≡ Π A 1 , A 2 , . . . A n ( σ F ( E ) ) {\sigma}_F({\Pi}_{A_1,A_2,...A_n}(E)){\equiv}{\Pi}_{A_1,A_2,...A_n}({\sigma}_F(E)) σF(ΠA1,A2,...An(E))ΠA1,A2,...An(σF(E)) ,其中

  • 选择条件 F F F 指涉及属性 A i ( i = 1 , 2 , . . . n ) A_i(i=1,2,...n) Ai(i=1,2,...n)

  • F F F 中有不属于 A i ( i = 1 , 2... n ) A_i(i=1,2...n) Ai(i=1,2...n) 的属性 B i ( i = 1 , 2 , . . . m ) B_i(i=1,2,...m) Bi(i=1,2,...m) ,则有更一般规则:

    Π A 1 , A 2 , . . . A n ( σ F ( E ) ) ≡ Π A 1 , A 2 , . . . A n ( σ F ( Π A 1 , A 2 , . . . A n , B 1 , B 2 , . . . B m ( E ) ) ) {\Pi}_{A_1,A_2,...A_n}({\sigma}_F(E)){\equiv}{\Pi}_{A_1,A_2,...A_n}({\sigma}_F({\Pi}_{A1,A2,...A_n,B_1,B_2,...B_m}(E))) ΠA1,A2,...An(σF(E))ΠA1,A2,...An(σF(ΠA1,A2,...An,B1,B2,...Bm(E)))

⑥ 选择与笛卡尔积的交换律

F F F 中涉及的属性都是 E 1 E_1 E1 中的属性,则:

σ F ( E 1 × E 2 ) ≡ σ F ( E 1 ) × E 2 {\sigma}_F(E_1{\times}E_2){\equiv}{\sigma}_F(E_1){\times}E_2 σF(E1×E2)σF(E1)×E2

F = F 1 ∧ F 2 F=F_1{\wedge}F_2 F=F1F2 ,且 F 1 F_1 F1 中只涉及 E 1 E_1 E1 中的属性, F 2 F_2 F2 中只涉及 E 2 E_2 E2 中的属性,则:

σ F ( E 1 × E 2 ) ≡ σ F 1 ( E 1 ) × σ F 2 ( E 2 ) {\sigma}_F(E_1{\times}E_2){\equiv}{\sigma}_{F_1}(E_1){\times}{\sigma}_{F_2}(E_2) σF(E1×E2)σF1(E1)×σF2(E2)

F 1 F_1 F1 只涉及 E 1 E_1 E1 中的属性, F 2 F_2 F2 涉及 E 1 E_1 E1 E 2 E_2 E2 两者的属性,则仍然有:

σ F ( E 1 × E 2 ) ≡ σ F 2 ( σ F 1 ( E 1 ) × E 2 ) {\sigma}_F(E_1{\times}E_2){\equiv}{\sigma}_{F_2}({\sigma}_{F_1}(E_1){\times}E_2) σF(E1×E2)σF2(σF1(E1)×E2)

这样可以使得部分选择再笛卡尔积之前先做

⑦ 选择与并的分配律

E = E 1 ∪ E 2 E=E_1{\cup}E_2 E=E1E2 E 1 E_1 E1 E 2 E_2 E2 有相同的属性名,则:

σ F ( E 1 ∪ E 2 ) ≡ σ F ( E 1 ) ∪ σ F ( E 2 ) {\sigma}_F(E_1{\cup}E_2){\equiv}{\sigma}_F(E_1){\cup}{\sigma}_F(E_2) σF(E1E2)σF(E1)σF(E2)

⑧ 选择与差运算的分配律

E 1 E_1 E1 E 2 E_2 E2 有相同的属性名,则:

σ F ( E 1 − E 2 ) ≡ σ F ( E 1 ) − σ F ( E 2 ) {\sigma}_F(E_1{-}E_2){\equiv}{\sigma}_F(E_1){-}{\sigma}_F(E_2) σF(E1E2)σF(E1)σF(E2)

⑨ 选择对自然连接的分配律

F F F 只涉及 E 1 E_1 E1 E 2 E_2 E2 的公共属性,则:

σ F ( E 1 × n a t r u a l E 2 ) ≡ σ F ( E 1 ) × n a t r u a l σ F ( E 2 ) {\sigma}_F(E_1{\times}_{natrual}E_2){\equiv}{\sigma}_F(E_1){\times}_{natrual}{\sigma}_F(E_2) σF(E1×natrualE2)σF(E1)×natrualσF(E2)

⑩ 投影与笛卡尔积的分配律

E 1 E_1 E1 E 2 E_2 E2 是两个关系表达式, A 1 A_1 A1 ,… A n A_n An E 1 E_1 E1 的属性, B 1 B_1 B1 ,… B m B_m Bm E 2 E_2 E2 的属性,则:

Π A 1 , . . . , A n , B 1 , . . . B m ( E 1 × E 2 ) = Π A 1 , . . . A n ( E 1 ) × Π B 1 , . . . B m ( E 2 ) {\Pi}_{A_1,...,A_n,B_1,...B_m}(E_1{\times}E_2)={\Pi}_{A_1,...A_n}(E_1){\times}{\Pi}_{B_1,...B_m}(E_2) ΠA1,...,An,B1,...Bm(E1×E2)=ΠA1,...An(E1)×ΠB1,...Bm(E2)

⑩① 投影与并的分配律

E 1 E_1 E1 E 2 E_2 E2 有相同的属性名,则:

Π A 1 , A 2 , . . . A n ( E 1 ∪ E 2 ) ≡ Π A 1 , A 2 , . . . A n ( E 1 ) ∪ Π A 1 , A 2 , . . . A n ( E 2 ) {\Pi}_{A_1,A_2,...A_n}(E_1{\cup}E_2){\equiv}{\Pi}_{A_1,A_2,...A_n}(E_1){\cup}{\Pi}_{A_1,A_2,...A_n}(E_2) ΠA1,A2,...An(E1E2)ΠA1,A2,...An(E1)ΠA1,A2,...An(E2)

物理优化

基于启发式规则的存取路径选择优化

典型的启发式规则

① 选择运算应尽可能先做

② 把投影运算和选择运算同时进行

(如有若干个投影和选择运算,并且都对同一个关系操作,则可以再扫描此关系的同时完成所有这些运算,以避免重复扫描关系)

③ 把投影运算同其前后的双目运算结合起来

(没必要为了去掉某些字段而扫描一遍关系)

④ 把某些选择同它前面要执行的笛卡尔积结合起来成为一个连接运算

(连接特别是等值连接运算要比同样关系上的笛卡尔积省很多时间)

⑤ 找出公共子表达式

(如果重复出现的子表达式的结果不是很大的关系,并且从外村中读入这个关系比计算该子表达式的时间少得多,则先计算一次公共子表达式,并把结果写入中间文件是合算的)

(当查询的是视图时,定义视图的表达式就是公共子表达式的情况)

方法

① 利用等价变换规则 4,把形如 σ F 1 ∧ F 2 ∧ . . . ∧ F n ( E ) {\sigma}_{F_1{\wedge}F_2{\wedge}...{\wedge}F_n}(E) σF1F2...Fn(E) 变换为 σ F 1 ( σ F 2 ( . . . ( σ F n ( E ) ) ) ) {\sigma}_{F_1}({\sigma}_{F_2}(...({\sigma}_{F_n}(E)))) σF1(σF2(...(σFn(E))))

② 对每一个选择,尽可能把它移动到树的叶端(即尽可能先做)

③ 对每一个投影,尽可能把它移动到树的叶端(即尽可能先做)

④ 把选择和投影的串接合并成单个选择、单个投影或一个选择后跟一个投影,使多个选择或投影能同时执行,或在一次扫描中全部完成

⑤ 把上述得到的语法树的内节点分组

  • 每一双目运算( × {\times} × × n a t u r a l {\times}_{natural} ×natural ∪ {\cup} − - )和它所有的直接祖先为一组(直接祖先是 σ {\sigma} σ Π {\Pi} Π 运算)

  • 如果其后代直到叶子全是单目运算,则也将它们并入该组

  • 但当双目运算是笛卡尔积( × {\times} ×)时,且后面不是与它组成等值连接的选择时,则不能把选择与这个双目运算组成一组

上面的实例:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Air浩瀚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值