在工作中遇到一条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要少些呢?
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要少些呢?
还有你说的执行计划是什么?
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(+)
应该会更快
今天已经下班了,明天再试吧
不过我觉得先连接a和c表的话,第一步就会生成更多记录,占用更多内存,我觉得速度只会更慢才对啊,能解释一下吗?另外有谁能解释一下inner/outer 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(+)
差不多。
不过我以前看到书上说inner join的效率应该高一些才对啊,能不能解释一下为什么inner join的效率会低一些呢?或者提供一些相关的资料?
十分感谢