今天在网上看到一篇讲SQL优化的帖子,
但是怎么都没弄明白下面红色部分,
可又有很多论坛都转载了这帖子,却没人反驳,谁能解释一下,是不是我理解得不对?关于第8条
根据【越有效地缩小范围的条件越放后】的原则,我觉得第一条sql效率高
xh_bz=1 就筛选到只有0.5%的数据了,
然后在这5%的数据里面选择dy_dj = '1KV以下'
不对么?难道【越有效地缩小范围的条件越放后】只适合多表?---------------------------------------------------------------------------------------------。
8. WHERE后面的条件顺序影响
WHERE子句后面的条件顺序对大数据量表的查询会产生直接的影响,如:
Select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1
Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV以下'
以上两个SQL中dy_dj(电压等级)及xh_bz(销户标志)两个字段都没进行索引,所以执行的时候都是全表扫描;第一条SQL的dy_dj = '1KV以下'条件在记录集内比率为99%,而xh_bz=1的比率只为0.5%,在进行第一条SQL的时候99%条记录都进行dy_dj及xh_bz的比较,而在进行第二条SQL的时候0.5%条记录都进行dy_dj及xh_bz的比较,以此可以得出第二条SQL的CPU占用率明显比第一条低。表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. [越有效地缩小范围的条件越放后]
。。
但是怎么都没弄明白下面红色部分,
可又有很多论坛都转载了这帖子,却没人反驳,谁能解释一下,是不是我理解得不对?关于第8条
根据【越有效地缩小范围的条件越放后】的原则,我觉得第一条sql效率高
xh_bz=1 就筛选到只有0.5%的数据了,
然后在这5%的数据里面选择dy_dj = '1KV以下'
不对么?难道【越有效地缩小范围的条件越放后】只适合多表?---------------------------------------------------------------------------------------------。
8. WHERE后面的条件顺序影响
WHERE子句后面的条件顺序对大数据量表的查询会产生直接的影响,如:
Select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1
Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV以下'
以上两个SQL中dy_dj(电压等级)及xh_bz(销户标志)两个字段都没进行索引,所以执行的时候都是全表扫描;第一条SQL的dy_dj = '1KV以下'条件在记录集内比率为99%,而xh_bz=1的比率只为0.5%,在进行第一条SQL的时候99%条记录都进行dy_dj及xh_bz的比较,而在进行第二条SQL的时候0.5%条记录都进行dy_dj及xh_bz的比较,以此可以得出第二条SQL的CPU占用率明显比第一条低。表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. [越有效地缩小范围的条件越放后]
。。
解决方案 »
- [提问]关于连接/关闭数据库的问题
- sql如何实现 把同城市年度一级天数最多的月份合并成一条记录。
- 请问查询时怎么用“0”替代空值?
- 登陆Management Server mserver问题:急!!!(给分)
- 大家帮我看下面的存储过程出什么错?
- 关于to_number()函数的问题。。。
- 又一菜鸟问题
- 初学ORACLE,推荐本好点的入门书吧
- qiuyang_wang来领分,你的回答的确是最好的。
- org.hibernate.QueryParameterException: could not locate parameter [payStatus]
- 索引优化的问题
- 关于:表,视图,约束,索引,同义词,存储过程,函数,触发器,包
我理解就是 全部10000条数据的话
1KV以下的数据:9900条
销户的数据:50条然后对于这个优化方法,我的理解是
把xh_bz=1放在后面,可以最大的缩小范围,
也就是只剩下50条数据,然后再去做dy_dj = '1KV以下'的比较
(我现在没有DB可以试验)
主要是根据ORACLE的解析规则,是从下往上解析
不过用CBO,就无所谓的
以你的例子为例,第一条SQL,99%的数据被取出来,然后在99%的基础上获取0.5%的数据,第二条正好相反。
假设不考虑索引,表中有10000条数据,每遍历一行,消耗资源1,那么第一条SQL耗费的资源为 10000+10000*0.99,第二条耗费资源为10000+10000*0.005。
前面的10000指第一次过滤需要遍历的行数,后面的数字指第二次过滤需要遍历的行数,现在优劣就看出来了
对啊,我就是理解为越远越先执行
第一条,xh_bz=1 远,所以先执行,所以耗资源10000
然后才是再10000×0.005的基础上执行 dy_dj = '1KV以下'
所以我理解第一条才是10000+10000*0.005第二条是10000+10000*0.99