两个大表的关联查询问题-如何提高效率

cxf1976 2008-04-21 01:28:12
现在有两个表,都有10万条记录

A表
--------------------
id name age sex

B表
-----------------------
id address phone birth

其中B表中的ID集合,是A表ID的子集。
现在要执行如下语句:
select count(*) from A where id in (select id from B)

发现效率很低,怎么改比较好。各位兄弟给点建议,多谢!
...全文
2144 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
doer_ljy 2008-04-22
  • 打赏
  • 举报
回复
很难理解,自己从没有遇到过使用内连接性能低于exists的例子。
在我本地的测试中楼上的sql是要经历两个Table Access Full的。
而是用等值连接只需要对较小的表作一个Table Access Full,对另一个表则是by index的。
希望楼主能贴出两种SQL的执行计划作进一步分析。
cxf1976 2008-04-22
  • 打赏
  • 举报
回复
select count(*) from A aaa where exists ( select null from B bbb where bbb.id = aaa.id)
cxf1976 2008-04-22
  • 打赏
  • 举报
回复
select count(*) from A aaa where exists ( select null from B bbb where bbb.id = aaa.Business_ID )



zhu_gx 2008-04-21
  • 打赏
  • 举报
回复
帮顶
qiyousyc 2008-04-21
  • 打赏
  • 举报
回复
肯定是内连接from A,b where A.id =B.ID
其次是exists语句的效率是最高的。
这种数据量的情况下,不要用in去实现,效率太差。


如果你的内存够大的话,内连接会比exists效率高很多。
huangqing_80 2008-04-21
  • 打赏
  • 举报
回复
楼主,如果你在两个表的id上都建立了索引,那么利用表关联的方法应该比exists更有效才对啊
huangqing_80 2008-04-21
  • 打赏
  • 举报
回复
问楼主,如果换用exists子句,该怎么写
ColinGan 2008-04-21
  • 打赏
  • 举报
回复
对于IN语句,需要消耗大量的CPU。
一般采用“联机视图”来替代“IN”操作。

语法如下:
select count(*) from A,(select id from B) x
where A.ID = x.ID
and ...

其中select id from b为联机视图,你可以在这里添加各种条件。
cxf1976 2008-04-21
  • 打赏
  • 举报
回复
楼上兄弟,这两个表,行数很多。使用WHERE a.id = b.id;不能改善效率。
经测试exists子句确实效率更高。
panxuan 2008-04-21
  • 打赏
  • 举报
回复
使用表关联。

SELECT COUNT(a.id) FROM A AS a,B AS b WHERE a.id = b.id;
cxf1976 2008-04-21
  • 打赏
  • 举报
回复
多谢楼上各位兄弟,受益匪浅。
期待更多建议。
cxf1976 2008-04-21
  • 打赏
  • 举报
回复
这个应用可能不需要inner join;
select * from a,b where a.id=b.id在我的应用中好像效率有限。
CathySun118 2008-04-21
  • 打赏
  • 举报
回复
select count(A.ID) from A,b where A.id =B.ID
sinxy 2008-04-21
  • 打赏
  • 举报
回复
需要查询的字段建立索引
然后用inner join来查询

cxf1976 2008-04-21
  • 打赏
  • 举报
回复
谢谢doer_ljy 兄弟,可能您的方法不适合我的情况,刚实验了一下您的方法,提高不多
cxf1976 2008-04-21
  • 打赏
  • 举报
回复
刚刚使用exists替换in,性能提高30%,真不错。
还有别的方法吗?
doer_ljy 2008-04-21
  • 打赏
  • 举报
回复
select count(*) from A,b where A.id =B.ID
cxf1976 2008-04-21
  • 打赏
  • 举报
回复
多谢楼上。
现在的两个表,都对id建立索引了。
alarmiss 2008-04-21
  • 打赏
  • 举报
回复
1.不要用in,用exists;
2.对经常出现在条件中的非主键字段,比如age,建索引;
cxf1976 2008-04-21
  • 打赏
  • 举报
回复
更复杂一些的查询
select count(*) from A where and age>18 and age<60 and id in (select id from B)

3,494

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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