语法分析
构造语法分析树
SQL查询语法分析
初始逻辑查询计划生成
- 关系代数
- 关系代数与SQL语句的转化
查询重写
初始逻辑查询计划->优化的逻辑查询计划
转换规则
R
×
S
=
S
×
R
R×S=S×R
R×S=S×R;
(
R
×
S
)
×
T
=
R
×
(
S
×
T
)
(R×S)×T=R×(S×T)
(R×S)×T=R×(S×T);
R
⋈
S
=
S
⋈
R
R\Join S=S\Join R
R⋈S=S⋈R;
(
R
⋈
S
)
⋈
T
=
R
⋈
(
S
⋈
T
)
(R\Join S)\Join T= R\Join (S\Join T)
(R⋈S)⋈T=R⋈(S⋈T)
R
∪
S
=
S
∪
R
R\cup S= S\cup R
R∪S=S∪R;
(
R
∪
S
)
∪
T
=
R
∪
(
S
∪
T
)
(R\cup S)\cup T=R\cup (S\cup T)
(R∪S)∪T=R∪(S∪T)
R
∩
S
=
S
∩
R
R\cap S= S\cap R
R∩S=S∩R;
(
R
∩
S
)
∩
T
=
R
∩
(
S
∩
T
)
(R\cap S)\cap T=R\cap (S\cap T)
(R∩S)∩T=R∩(S∩T)
σ
c
1
∧
c
2
(
R
)
=
σ
c
1
(
σ
c
2
(
R
)
)
\sigma_{c1\land c2}(R)=\sigma_{c1}(\sigma_{c2}(R))
σc1∧c2(R)=σc1(σc2(R))
σ
c
1
∨
c
2
(
R
)
=
σ
c
1
(
R
)
∪
s
σ
c
2
(
R
)
\sigma_{c1\lor c2}(R)=\sigma_{c1}(R)\cup_s \sigma_{c2}(R)
σc1∨c2(R)=σc1(R)∪sσc2(R)
σ
p
(
R
⋈
S
)
=
σ
p
(
R
)
⋈
S
\sigma_{p}(R\Join S)=\sigma_p(R)\Join S
σp(R⋈S)=σp(R)⋈S;
σ
p
(
R
⋈
S
)
=
R
⋈
σ
p
(
S
)
\sigma_{p}(R\Join S)=R\Join \sigma_p(S)
σp(R⋈S)=R⋈σp(S);
σ
p
∧
q
(
R
⋈
S
)
=
σ
p
(
R
)
⋈
σ
q
(
S
)
\sigma_{p\land q}(R\Join S)=\sigma_p(R)\Join \sigma_q(S)
σp∧q(R⋈S)=σp(R)⋈σq(S)
σ
p
∧
q
∧
t
(
R
⋈
S
)
=
σ
p
(
σ
q
(
R
)
⋈
σ
t
(
S
)
)
\sigma_{p\land q\land t}(R\Join S)=\sigma_p(\sigma_q(R)\Join \sigma_t(S))
σp∧q∧t(R⋈S)=σp(σq(R)⋈σt(S))
σ
p
∨
q
(
R
⋈
S
)
=
σ
p
(
R
⋈
S
)
∪
σ
q
(
R
⋈
S
)
\sigma_{p\lor q}(R\Join S)=\sigma_p(R\Join S)\cup \sigma_q(R\Join S)
σp∨q(R⋈S)=σp(R⋈S)∪σq(R⋈S)
π
x
y
(
R
⋈
S
)
=
π
x
y
(
π
x
z
(
R
)
⋈
π
y
z
(
S
)
)
\pi_{xy}(R\Join S)=\pi_{xy}(\pi_{xz}(R)\Join\pi_{yz}(S))
πxy(R⋈S)=πxy(πxz(R)⋈πyz(S))
注意对于不同顺序的
⋈
\Join
⋈他们导致的中间代价不同
SQL中的Union All和Union的区别:Union All不去重不排序,Union去重且排序
查询代价估计
中间结果的大小估计
- 统计量
T®:R的元组个数
S®:R的每个元组大小(bytes)
V(R,A):R的属性A的不同取值个数
B®:容纳R的所有元组所需的块数
T(W) | S(W) | |
---|---|---|
W=R1×R2 | T(R1)*T(R2) | S(R1)+S(R2) |
W= σ A = a ( R ) \sigma_{A=a}(R) σA=a(R) | T ( R ) / V ( R , a ) T (R)/V(R,a) T(R)/V(R,a) | S ( R ) S(R) S(R) |
W= σ z > v a l ( R ) \sigma_{z>val}(R) σz>val(R) | T ( R ) / 2 T (R)/2 T(R)/2或者通过取值范围进行估计 | S ( R ) S(R) S(R) |
W= σ z ! = v a l ( R ) \sigma_{z!=val}(R) σz!=val(R) | T ( R ) ( 1 − 1 / V ( R , z ) ) T (R)(1-1/V(R,z)) T(R)(1−1/V(R,z)) | S ( R ) S(R) S(R) |
W = R ⋈ S W=R\Join S W=R⋈S(R与S的共同属性为A) | T ( R ) ∗ T ( S ) / m a x ( V ( R , A ) , V ( S , A ) ) T(R)*T(S)/max(V(R,A), V(S,A)) T(R)∗T(S)/max(V(R,A),V(S,A)) | S ( R ) + S ( S ) − S ( A ) S(R)+S(S)-S(A) S(R)+S(S)−S(A) |
且对于最后一种情况,V(W,A)=min(V(R,A), V(S,A))
IO代价估计
- 估计目标:执行查询计划所必须读写的磁盘块数目
- 还需要的参数:
B ( R ) B(R) B(R):R所需要的的块数
f®:每块可容纳的R的最大元组数
M:可用的内存块数
HT(i):索引i的层数
LB(i):索引i的叶结点所需的块数
- 影响查询计划IO代价的因素
1)实现查询计划的逻辑操作符
2)中间结果的大小
3)实现逻辑操作符的物理操作符(索引连接/散列连接)
4)相似操作的顺序(多关系的连接顺序)
5)物理操作符之间的参数传递方式
物化方式:操作以此执行,每个操作的中间关系都写到磁盘上供其他操作存取
流水线:多个操作同时进行,一个操作产生的元组直接