select a.dwh, b.dwbm, b.qc, b.jc, c.qxm, c.dm, a.bxh, a.gh, a.xm, a.sfzh 
from qxb c, dwb b, grb a where b.dwbm = '215940301' and a.txh = '1' and a.zt in ('2', '3') and a.dwh = b.dwh and a.qx (+)= c.xzm;select a.dwh, b.dwbm, b.qc, b.jc, c.qxm, c.dm, a.bxh, a.gh, a.xm, a.sfzh 
from (grb a inner join dwb b on a.dwh = b.dwh) left join qxb c on a.qx = c.xzm where b.dwbm = '215940301' and a.txh = '1' and a.zt in ('2', '3');上面的语句执行需850多秒
下面的语句执行需60秒左右为什么相同功能的两条语句执行效率要差那么多?
请大家一起分析一下。

解决方案 »

  1.   

    两个语句不同吧,a.qx (+)= c.xzm应该是a right join c on a.qx = c.xzm
      

  2.   

    +是8i里面的功能,right是9i里面的
    两个都是表达的意思都是一样的,只是9i以后的版本做了一些优化
      

  3.   

    不知道你的执行计划是什么样的
    第二个语句是 A与B内连接的结果和C表做外连接,A与B先做一次内连接过滤掉大部分数据,小部分数据在和B表做外连接当然快一点了
    第一个语句如果先执行 a.qx (+)= c.xzm; 那就跟没过滤到什么数据,这样就做了两次大不表关联
      

  4.   

    呵呵,我也有时是这样的。
    先用子查询过滤大部分数据,再连接就快多了。
    但如果建立了索引就大不一样了,因为Select子查询后的结果集是没有索引的,而索引的作用就是类似数据结构中的快表查询,对大数据量操作的改善是非常有用的!
      

  5.   

    同意47522341(睡到8:30)的观点,同时语句中这里a.zt in ('2', '3'),如果在这个字段建立索引的话,这里要分开写2条一条a.zt=‘2’,另一条a.zt=‘3’,因为条件中用到in的话不能使用索引