【数据库】数据库查询优化方法——查询重写2

查询的执行,就是查询处理的过程,即数据库按用户指定的SQL语句中的语义,执行语义所限定的操作。但SQL语句的执行效率对数据库的效率影响较大。为了提高查询语句的执行效率,对查询语句进行优化是必不可少的。对查询语句进行优化的技术就是查询优化技术,运用查询技术实现数据操纵功能的过程是确定给定查询的高效执行计划的过程。所谓执行计划就是查询树,它由一系列内部的操作符组成,这些操作符按一定的运算关系构成查询的一个执行方案。查询优化的追求目标,就是在数据库查询优化引擎生成一个执行策略的过程中,尽量使查询的总开销(总开销通常包括IO、CPU、网络传输等)达到最小。

一、外连接消除

1.外连接消除的意义

外连接操作可分为左外连接、右外连接和全外连接。连接过程中,外连接的左右子树不能互换,并且外连接与其他连接交换连接顺序时,必须满足严格的条件以进行等价变换。这种性质限制了优化器在选择连接顺序时能够考虑的表与表交换连接位置的优化方式。查询重写的一项技术就是把外连接转换为内连接,转换的意义(对优化的意义)如下:

❏查询优化器在处理外连接操作时所需执行的操作和时间多于内连接。

❏优化器在选择表连接顺序时,可以有更多更灵活的选择,从而可以选择更好的表连接顺序,加快查询执行的速度。

❏表的一些连接算法(如块嵌套连接和索引循环连接等)将规模小的或筛选条件最严格的表作为“外表”(放在连接顺序的最前面,是多层循环体的外循环层),可以减少不必要的IO开销,极大地加快算法执行的速度。

2.外连接消除的条件

外连接可转换为内连接的条件:WHERE子句中与内表相关的条件满足“空值拒绝”(reject-NULL条件)。那么条件怎么才算是满足空值拒绝呢?一般认为满足下面任意一种情况时,即满足空值拒绝:

❏条件可以保证从结果中排除外连接右侧(右表)生成的值为NULL的行(即条件确保应用在右表带有空值的列对象上时,条件不满足,条件的结果值为FLASE或UNKOWEN,这样右表就不会有值为NULL的行生成),所以能使该查询在语义上等效于内连接。

❏外连接的提供空值的一侧(可能是左侧的外表也可能是右侧的内表)为另一侧的每行只返回一行。如果该条件为真,则不存在提供空值的行,并且外连接等价于内连接。

二、嵌套连接消除

多表连接有时会存在嵌套的情况。对于一个无嵌套的多表连接,表之间的连接次序是可以交换的,这样能灵活求解不同连接方式的花费,进而得到最小花费的连接方式。而嵌套连接则不能够利用交换表的位置而获得优化。那么,什么是嵌套连接呢?当执行连接操作的次序不是从左到右逐个进行时,就说明这样的连接表达式存在嵌套。如:

select * from T1 left join (T2 left join T3 on T2.id=T3.id) on T1.id=T2.id
where T1.age>18

先t2与t3连接,得到中间结果{t2t3}后再与t1连接,这种方式就是嵌套连接,括号不可以去掉,没有去掉括号的等价形式。如果连接顺序是t1、t2、t3,则不存在嵌套。

三、语义优化

因为语义的原因,使得SQL可以被优化。这里包括以下两个基本概念:

❏语义转换。因为完整性限制等的原因使得一个转换成立的情况称为语义转换。

❏语义优化。因为语义转换形成的优化称为语义优化。

通常,任何的完整性限制条件等都可以用于语义优化。语义转换其实是根据完整性约束等信息对“某特定语义”进行推理,进而得到的一种查询效率不同但结果相同的查询。语义优化是从语义的角度对SQL进行优化,不是一种形式上的优化,所以其优化的范围,可能覆盖其他类型的优化范围。

❏连接消除(Join Elimination)。对一些连接操作先不必评估代价,根据已知信息(主要依据完整性约束等,但不全是依据完整性约束)能推知结果或得到一个简化的操作。例如,利用A、B两个基表做自然连接,创建一个视图V,如果在视图V上执行查询只涉及其中一个基表的信息,则对视图的查询完全可以转化为对某个基表的查询。

❏连接引入(Join Introduction)。增加连接有助于原关系变小或原关系的选择率降低。

❏谓词引入(Predicate Introduction)。根据完整性约束等信息引入新谓词,如引入基于索引的列,可能使得查询更快。如一个表上,有c1<c2的列约束,c2列上存在一个索引,查询语句中的WHERE条件有c1>200,则可以推知c2>200,WHERE条件变更为c1>200AND c2>200AND c1<c2,由此可以利用c2列上的索引,对查询语句进行优化。如果c2列上的索引的选择率很低,则优化效果会更高。

❏检测空回答集(Detecting the Empty Answer Set)。查询语句中的谓词与约束相悖,可以推知条件结果为FALSE,也许最终的结果集能为空;如CHECK约束限定score列的范围是60到100,而一个查询条件是score<60,则能立刻推知条件不成立。

❏排序优化(Order Optimizer)。ORDERBY操作通常由索引或排序(sort)完成;如果能够利用索引,则排序操作可省略。另外,结合分组等操作,考虑ORDERBY操作的优化。

❏唯一性使用(Exploiting Uniqueness)。利用唯一性、索引等特点,检查是否存在不必要的DISTINCT操作,如在主键上执行DISTINCT操作,若有则可以把DISTINCT消除掉。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值