今天在网上看到一篇讲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子句的末尾. [越有效地缩小范围的条件越放后]
。。

解决方案 »

  1.   

    比率?
    我理解就是  全部10000条数据的话
    1KV以下的数据:9900条
    销户的数据:50条然后对于这个优化方法,我的理解是
    把xh_bz=1放在后面,可以最大的缩小范围,
    也就是只剩下50条数据,然后再去做dy_dj = '1KV以下'的比较
      

  2.   

    谁有DB,可以试验一下,给个可信的结果?
    (我现在没有DB可以试验)
      

  3.   

    那些是老的,基于规则的,10g,11g之后已经默认是基于成本了,所以默认情况下和顺序无关。写SQL的人可以更多地关心业务。
      

  4.   

    那是以前基于RBO来写的
    主要是根据ORACLE的解析规则,是从下往上解析
    不过用CBO,就无所谓的
      

  5.   

    那个问题你可以理解为,离where越远的过滤条件,在执行时越先被过滤出来,离where近的,基于被过滤出来的数据作再过滤。
    以你的例子为例,第一条SQL,99%的数据被取出来,然后在99%的基础上获取0.5%的数据,第二条正好相反。
    假设不考虑索引,表中有10000条数据,每遍历一行,消耗资源1,那么第一条SQL耗费的资源为 10000+10000*0.99,第二条耗费资源为10000+10000*0.005。
    前面的10000指第一次过滤需要遍历的行数,后面的数字指第二次过滤需要遍历的行数,现在优劣就看出来了
      

  6.   


    对啊,我就是理解为越远越先执行
    第一条,xh_bz=1 远,所以先执行,所以耗资源10000
    然后才是再10000×0.005的基础上执行   dy_dj = '1KV以下' 
    所以我理解第一条才是10000+10000*0.005第二条是10000+10000*0.99
      

  7.   

    我在SQL server2005中试了,和顺序没有关系,sql Server会对where条件进行优化
      

  8.   

    10G我也测试了,与where后面的条件的顺序没有关系
      

  9.   

    9i 中就和顺序没关系了。你人能想到的,现在oracle的开发人员也能想到并付予实施了。