ch5.查询编译器
语法分析和预处理
SQL语句的语法分析阶段,会根据文法,对输入的词语产生一个语法树
例如,下述语言:
SELECT movieTitle
FROM Starsln
WHERE starName IN (
SELECT name
FROM MovieStar
WHERE birtbdate LIKE '%1960'
);
在进行语法分析后,会转换为下述语法树:
此外,如果查询语句中用到的关系是虚视图的话,则预处理器将会对语法树进行相应的替换
用于改进查询计划的代数规律
利用这些代数规律,从而生成逻辑查询计划
交换律与结合律
下述运算符同时满足结合律与交换律:
而 θ \theta θ连接 ⋈ C \Join_C ⋈C则只满足交换律,不一定满足结合律
涉及选择的定律
σ \sigma σ运算符的分解定律:
更一般地,可以任意交换 σ \sigma σ运算符的顺序:
其他定律:
下推选择
代数规则有时候可以反过来用
涉及投影的定律
假定M和N是连接属性:
有关连接与积的定律
有关消除重复的定律
涉及分组与聚集的定律
从语法分析树到逻辑查询计划
转换成关系代数
对于没有子查询的情形,可以直接将简单的select <SelList> from <FromList> where <Condition>结构转换为关系代数:
1、将<FromList>中提及的全部关系放在最底下,由积相连接
2、随后使用
σ
c
\sigma_c
σc进行选择,c为<Condition>
3、最后使用
π
L
\pi_L
πL进行投影,L为<SelList>中的属性列表
例如,将下图的语法树转换为关系代数:
从条件中去除子查询
当条件<Condition>包含子查询时,需要先将<Condition>作为一个子树,对这个子树进行转换,随后再利用转换的结果和<FromList>中的关系进行运算
例如,将下图的语法树转换为关系代数:
逻辑查询计划的改进
语法树转换为关系代数后,就可以开始考虑利用代数定律,重写查询计划了。重写查询计划的主要目的,就在于得到最“便宜”的物理计划。
运算代价的估计
投影运算大小的估计
投影一般会使得关系缩小,但是用扩展投影时,有可能反而还会增大
选择运算大小的估计
最简单的选择为:一个属性等于某个常量,即 S = σ A = c ( R ) S=\sigma_{A=c}(R) S=σA=c(R)。这种情况下,可以这样估计: T ( S ) = T ( R ) / V ( R , A ) T(S)=T(R)/V(R,\ A) T(S)=T(R)/V(R, A)
而如果选择中涉及非等值比较,形如: S = σ a < 10 ( R ) S=\sigma_{a<10}(R) S=σa<10(R),则难以估计大小,一般会估计为: T ( S ) = T ( R ) / 3 T(S)=T(R)/3 T(S)=T(R)/3
当选择中含有多个等值与非等值比较的AND时,可以使用级联: T ( R ) ∗ C T(R)*C T(R)∗C,其中 C C C为对于各个条件所估计的 T ( R ) ∗ A T(R)*A T(R)∗A中的 A A A的累乘
而当选择中含有多个等值与非等值比较的OR时,可以使用各个条件的结果大小的简单求和。然而,这样的估计却可能是不准的
连接运算大小的估计
根据各种假设,连接运算的大小被估计为: T ( R ⋈ S ) = T ( T(R\Join S)=T( T(R⋈S)=T(R ) T ( S ) / max ( V ( R , Y ) , V ( S , Y ) ) )T(S)/\max (V(R,\ Y),\ V(S,\ Y)) )T(S)/max(V(R, Y), V(S, Y))
多连接属性的自然连接
如果两关系 R ( X , Y ) R(X,\ Y) R(X, Y)和 S ( Y , Z ) S(Y,\ Z) S(Y, Z)之间的公共属性集Y包含多个属性,则在进行大小估计时,需要在T( R R R)T(S)的基础上,分别对各个V(R, y)、V(S, y),连续除以较大者。假设Y包含{ y 1 , y 2 y_1,\ y_2 y1, y2},则这个估计表达式可以表示为:
T ( R ⋈ S ) = T ( R ) T ( S ) / max ( V ( R , y 1 ) , V ( S , y 1 ) ) / max ( V ( R , y 2 ) , V ( S , y 2 ) ) T(R\Join S)=T(R)T(S)/\max(V(R,\ y_1),\ V(S,\ y_1))/\max(V(R,\ y_2),\ V(S,\ y_2)) T(R⋈S)=T(R)T(S)/max(V(R, y1), V(S, y1))/max(V(R, y2), V(S, y2))
多个关系的连接
对于自然连接的一般情形 S = R 1 ⋈ R 2 ⋈ ⋯ ⋈ R n S=R_1\Join R_2\Join\cdots \Join R_n S=R1⋈R2⋈⋯⋈Rn,使用如下规则:
从每个关系中元组数的积出发,然后,对于至少出现两次的属性除以除了V(R, A)
中最小值之外的所有值。
其他运算大小的估计
对于其他的运算,结果大小不易确定
并运算:采用包的并时,大小正好是参数大小之和。而集合的并则可以大至两参数大小之和,也可以小至两参数较大者,因此,取较大者和较小者的和的一半(中间值)
交运算:因为结果可以少到0,也可以多到两参数较少者,所以其中一个方法为取两极端的平均值(较小者的一半)
差运算:计算R-S时,结果中可能有T( R R R)至T( R R R)-T(S)个元组,因此,取平均值T( R R R)-T(S)/2
消除重复:可以取T( R R R)/2和 Π i V i ( R , a i ) \Pi_i V_i(R,\ a_i) ΠiVi(R, ai)中的较小者。依据: δ ( R ) \delta(R) δ(R)有两种上限,分别为R的大小与可能存在的不同元组的最大数
分组与聚集:可以取T( R R R)/2,因为T( R R R)可能是分组数量的上限
基于代价的计划选择介绍
大小参数估计值的获取
DBMS可以针对V(R, A)计算给定属性的各取值的直方图
使用直方图时,对连接的大小估计,会更加准确
统计量的计算
在査询优化器中,统计量通常仅是周期性地加以计算
减少逻辑查询计划代价的启发式估计
对不同的逻辑查询计划进行代价比较,选出代价最低的那一种
关于物理计划的枚举,可以有许多方式
连接顺序的选择
当连接以三个及以上的关系出现时,就需要考虑按什么顺序是最佳选择了。可以使用的方法包括:动态规划、贪婪算法等
物理查询计划选择的完成
???懵了懵了,根本看不过来,一周几十页,以后有缘再记