请教各位高手一条SQL的效率问题
在工作中遇到一条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要少些呢?
问题点数:50、回复次数:10Top
1 楼ZhangYaoxing(westxx)回复于 2005-08-04 12:56:01 得分 0
更正:后面那条语句应该没有countTop
2 楼bzszp(SongZip)回复于 2005-08-04 13:03:32 得分 15
你看一下执行计划有什么区别,应该就清楚了Top
3 楼bzszp(SongZip)回复于 2005-08-04 13:06:02 得分 0
但是我认为虽然两种写法不通,但是内部执行时应当是一样的。Top
4 楼ZhangYaoxing(westxx)回复于 2005-08-04 13:49:30 得分 0
我刚接触Oracle不久,请问这个Cost小是不是就代表效率更高一些呢?
还有你说的执行计划是什么?Top
5 楼ZhangYaoxing(westxx)回复于 2005-08-05 08:43:12 得分 0
顶一下,哪位能帮忙解答一下?谢谢Top
6 楼wbb1980()回复于 2005-08-05 16:31:23 得分 15
你试试这条语句
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(+)
应该会更快
Top
7 楼ZhangYaoxing(westxx)回复于 2005-08-08 19:14:14 得分 0
to wbb1980
今天已经下班了,明天再试吧
不过我觉得先连接a和c表的话,第一步就会生成更多记录,占用更多内存,我觉得速度只会更慢才对啊,能解释一下吗?
另外有谁能解释一下inner/outer join和(+)有什么不一样呢?Top
8 楼ZhangYaoxing(westxx)回复于 2005-08-10 08:44:20 得分 0
顶一下,希望各位能帮我一把Top
9 楼waterfirer(水清)回复于 2005-08-10 09:28:49 得分 20
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(+)
差不多。
Top
10 楼ZhangYaoxing(westxx)回复于 2005-08-10 12:36:19 得分 0
嗯,这个清楚了。
不过我以前看到书上说inner join的效率应该高一些才对啊,能不能解释一下为什么inner join的效率会低一些呢?或者提供一些相关的资料?
十分感谢Top




