sql查询效率

ruanwxh 2010-02-05 11:51:06
在oralce 有三张表
现在要根据某些条件,查询。
现在有两种查询方法:
1.将三张通过内联接或是左联接等,然后加on条件进查询
2.用where in(select id from 表B where 条件)来进行查询

请问下高手,上面两种方法,哪个效率会高?还有没有其他更好的办法
...全文
130 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
sorry0481 2010-02-06
  • 打赏
  • 举报
回复
学习了
Rotel-刘志东 2010-02-06
  • 打赏
  • 举报
回复
具体看一下执行计划了,最好不要用in 而用exists
Future_Hui_ 2010-02-06
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 ruanwxh 的回复:]
刚才没事的时候,我测了下
发现好像是in和exists好像一样的
我创建了test和stu两张表 (id,time)索引都建在id
test60w个数据,stu600个数据
用pl/sql测试
1.
select * from test where id in (select id from stu)

select * from test t where exists (select 1 from stu s where s.id = t.id)
****************************************************************
2.
select * from stu where id in (select id from test)

select * from stu s where exists (select 1 from test t where t.id =s.id)
按F5测试:
第1种情况cost 447
第2种情况cost 555

是不是orcle10g会自动优化呢?其他版本的情况呢
[/Quote]
10g自动优化
YY_MM_DD 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ruanwxh 的回复:]
引用 4 楼 yy_mm_dd 的回复:
很简单啊 .都写出来...跑下执行计划...比较下就可以了..

最好把in换成exist

跑下执行计划
是用工具吗?
我这边有PLSQL Developer工具,能说下具体操作吗?
[/Quote]

对.选定你的sql语句,按下F5.
碧水幽幽泉 2010-02-05
  • 打赏
  • 举报
回复
当然具体还得看执行计划!
碧水幽幽泉 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 ruanwxh 的回复:]
在oralce 有三张表
现在要根据某些条件,查询。
现在有两种查询方法:
1.将三张通过内联接或是左联接等,然后加on条件进查询
2.用where in(select id from 表B where 条件)来进行查询

请问下高手,上面两种方法,哪个效率会高?还有没有其他更好的办法
[/Quote]

一般方法1要高些!
当3张表关联的数据很少时,表连接要效率要高些!这点类似于exists.
当3张表关联的数据很多时,子查询的效率要高些!
如果你使用的是10g.11g的话,Oracle是基于CBO的!此时全表扫描会更快!

tangren 2010-02-05
  • 打赏
  • 举报
回复
在pl/sql的sql窗口中选择相应语句,按F5
ruanwxh 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yy_mm_dd 的回复:]
很简单啊 .都写出来...跑下执行计划...比较下就可以了..

最好把in换成exist
[/Quote]
跑下执行计划
是用工具吗?
我这边有PLSQL Developer工具,能说下具体操作吗?
ruanwxh 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 vanjayhsu 的回复:]
这个要根据三张表的特点来看。麻烦楼主介绍下三张表的结构、数据量等
[/Quote]
我简单说下
表A:通过外键关联表B,数据量中等
表B:通过外键关联表C,数据量大
表C:数据量小
huanmie_09 2010-02-05
  • 打赏
  • 举报
回复
三表关联要看表的数据量大小,sql优化里建议用exists替换in.
YY_MM_DD 2010-02-05
  • 打赏
  • 举报
回复
很简单啊 .都写出来...跑下执行计划...比较下就可以了..

最好把in换成exist
leonbanana 2010-02-05
  • 打赏
  • 举报
回复
in 的方法最好别用
sxq129601 2010-02-05
  • 打赏
  • 举报
回复
理论上where exists 快些,但是还是要快具体业务需求
vanjayhsu 2010-02-05
  • 打赏
  • 举报
回复
这个要根据三张表的特点来看。麻烦楼主介绍下三张表的结构、数据量等
oodick 2010-02-05
  • 打赏
  • 举报
回复
学习。
ruanwxh 2010-02-05
  • 打赏
  • 举报
回复
刚才没事的时候,我测了下
发现好像是in和exists好像一样的
我创建了test和stu两张表 (id,time)索引都建在id
test60w个数据,stu600个数据
用pl/sql测试
1.
select * from test where id in (select id from stu)

select * from test t where exists (select 1 from stu s where s.id = t.id)
****************************************************************
2.
select * from stu where id in (select id from test)

select * from stu s where exists (select 1 from test t where t.id =s.id)
按F5测试:
第1种情况cost 447
第2种情况cost 555

是不是orcle10g会自动优化呢?其他版本的情况呢
luhui436 2010-02-05
  • 打赏
  • 举报
回复
不要用in
woyaotaiyang 2010-02-05
  • 打赏
  • 举报
回复
个人感觉第二个不对:“2.用where id in(select id from 表B where 条件)来进行查询”
因为B表比较大最好,改为where exist(selcet id from 表B where 条件)
vanjayhsu 2010-02-05
  • 打赏
  • 举报
回复
嗯,是的。IN对内表是大表是不合适的。。。所以方法2是肯定不行的。。。
ruanwxh 2010-02-05
  • 打赏
  • 举报
回复
在网上有看到这篇
http://space.itpub.net/html/84/12361284-451.html
好像in 和 exits各有各效率。并不是最不好不用in
加载更多回复(1)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧