查询优化对我们执行sql语句是有很多帮助的,在我们平时使用的sql中都是做了优化的,当然我们可能看不到,这是因为机器做了这些事情,那这些事机器是如何做的呢?
一般步骤:
1.将查询转换成某种内部表示,通常是语法树
2. 根据一定的等价变换规则把语法树转换成标准
(优化)形式
3. 选择低层的操作算法
对于语法树中的每一个操作
计算各种执行算法的执行代价
选择代价小的执行算法
4. 生成查询计划(查询执行方案)
查询计划是由一系列内部操作组成的。
我个人的理解就是减少其中做的多余的部分。
1. 选择运算应尽可能先做
目的:减小中间关系
2. 在执行连接操作前对关系适当进行预处理
3. 按连接属性排序
在连接属性上建立索引
投影运算和选择运算同时做
目的:避免重复扫描关系
4. 将投影运算与其前面或后面的双目运算结合
目的:减少扫描关系的遍数
这一章什么都可以不会,就这不行
E1 × E2 ≡ E2 × E1
E1 等值连接 E2 ≡ E2 等值连接 E1
E1 自然连接 E2 ≡ E2 自然连接 E1
(E1×E2) × E3 ≡ E1 × (E2×E3)
(E1 等值连接 E2) 等值连接 E3 ≡ E1 等值连接 (E2 等值连接 E3)
(E1 自然连接 E2) 自然连接 E3 ≡ E1 自然连接 (E2 自然连接 E3)
π A1,A2, …,An(π B1,B2, …,Bm(E))≡ π A1,A2,…,An (E)
假设:
(1) E是关系代数表达式
(2) Ai(i=1,2,…,n), Bj(j=l,2,…,m)是属性名
(3){A1, A2, …, An}构成{Bl,B2,…,Bm}的子集
бF1 ( б F2(E))≡ бF1∧ F2(E)
(1)假设: 选择条件F只涉及属性A1,…,An
бF (πA1,A2,..,An(E))≡ πA1,A2, ...,An(бF(E))
(2)假设: F中有不属于A1, …,An的属性B1,…,Bm
π A1,A2,…,An ( бF (E))≡
πA1,A2,…,An(бF (πA1,A2, …,An,B1,B2, …,Bm(E)))
(1) 假设:F中涉及的属性都是E1中的属性
бF (E1×E2)≡бF (E1)×E2
(2) 假设:F=F1∧F2,并且F1只涉及E1中的属性,F2只涉及E2中的属性,则由上面的等价变换规则1,4,6可推出:
бF(E1×E2) ≡б F1(E1)×бF2 (E2)
(3) 假设: F=F1∧F2,
F1只涉及E1中的属性,
F2涉及E1和E2两者的属性
бF(E1×E2)≡б F2(бF1(E1)×E2)
它使部分选择在笛卡尔积前先做
假设:E=E1∪E2,E1,E2有相同的属性名
бF(E1∪E2)≡ бF(E1)∪ бF(E2)
假设:E1与E2有相同的属性名
бF(E1-E2)≡ бF(E1) - бF(E2)
假设:E1和E2是两个关系表达式,
A1,…,An是E1的属性,
B1,…,Bm是E2的属性
π A1,A2, …,An,B1,B2, …,Bm (E1×E2)≡
π A1,A2, …,An(E1)× π B1,B2, …,Bm(E2)
假设:E1和E2 有相同的属性名
π A1,A2, …,An(E1∪E2)≡
π A1,A2, …,An(E1)∪ π A1,A2, …,An(E2)
1-2: 连接、笛卡尔积的交换律、结合律
3: 合并或分解投影运算
4: 合并或分解选择运算
5-8: 选择运算与其他运算交换
5,9,10: 投影运算与其他运算交换