在工作中遇到一条SQL,在PL/SQL中,我自己完成的写法是
select * 
from T_DJ_JGNSR a inner join T_DJ_JGNSRFB b on a.nsrnbm=b.nsrnbm
     left outer join T_DJ_JGZYZJPW c on a.nsrnbm=c.nsrnbm
选定后F5,出来的结果是Cost 406....
后来别人给我改过之后的SQL是:
select count(*)
from T_DJ_JGNSR a ,T_DJ_JGNSRFB b,T_DJ_JGZYZJPW c
where a.nsrnbm=b.nsrnbm(+) and
     a.nsrnbm=c.nsrnbm(+)
再F5,结果是Cost 340....这三个表中,a/b表是一一对应关系,a/c表是一对多关系,请问为什么后面这种写法Cost要少些呢?

解决方案 »

  1.   

    更正:后面那条语句应该没有count
      

  2.   

    我刚接触Oracle不久,请问这个Cost小是不是就代表效率更高一些呢?
    还有你说的执行计划是什么?
      

  3.   

    你试试这条语句
    select count(*)
    from T_DJ_JGNSR a ,T_DJ_JGNSRFB b,T_DJ_JGZYZJPW c
    where a.nsrnbm=c.nsrnbm(+) and
         a.nsrnbm=b.nsrnbm(+)
    应该会更快
      

  4.   

    to wbb1980
    今天已经下班了,明天再试吧
    不过我觉得先连接a和c表的话,第一步就会生成更多记录,占用更多内存,我觉得速度只会更慢才对啊,能解释一下吗?另外有谁能解释一下inner/outer join和(+)有什么不一样呢?
      

  5.   

    outer join和(+)是一样的,和inner join不同。
    inner join会去掉表中不符合规则的记录,而outer join相反你试试
    select * 
    from T_DJ_JGNSR a left outer join T_DJ_JGNSRFB b on a.nsrnbm=b.nsrnbm
         left outer join T_DJ_JGZYZJPW c on a.nsrnbm=c.nsrnbm
    这个应该和
    select *
    from T_DJ_JGNSR a ,T_DJ_JGNSRFB b,T_DJ_JGZYZJPW c
    where a.nsrnbm=b.nsrnbm(+) and
         a.nsrnbm=c.nsrnbm(+)
    差不多。
      

  6.   

    嗯,这个清楚了。
    不过我以前看到书上说inner join的效率应该高一些才对啊,能不能解释一下为什么inner join的效率会低一些呢?或者提供一些相关的资料?
    十分感谢