如何提高关联查询速度?

山水无言 2004-06-16 11:16:35
在oracle数据中,假设有三个表A、B、C,A表的记录数超过了2000万条,B表和C表的记录数近1万条,它们存在一定的关系,即A表的a_id字段与B表的a_id字段关联,B表的b_id字段与C表的b_id字段关联,我的脚本如下:
select * from a where a_id in (select a_id from b where b_id in (select b_id from C))
这样写速度很慢,搜索的结果如果10万条,需要约20分钟,听说,用in确实很慢,请问,用什么命令快一些,上述语句该怎么修改?
...全文
232 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
legolas 2004-07-29
  • 打赏
  • 举报
回复
我也碰到了类似的问题,200万条记录,在小型机上跑了10分钟都没出来。用的是joint的方法。
wxyq 2004-06-22
  • 打赏
  • 举报
回复
to '
yazoox(考拉) (
楼主用的是select * from a where .....
可是各位DD们用的都是select * from a,b,c where .....
为什么from后都是a,b,c啊?
偶是新手别笑我啊.

select * from a where a_id in (select a_id from b where b_id in (select b_id from C))
他的意思是说 a_id 在 B,C中存在为条件


wxyq 2004-06-22
  • 打赏
  • 举报
回复
4。快的方法
select a.id into idtem from a,b,c where b.id = a.id and b.id = c.id
loop
select * from a where id = idtem
end loop

这样处理最快。
wxyq 2004-06-22
  • 打赏
  • 举报
回复
1. select a.* from a,b,c where b.id = a.id and b.id = c.id

2. a,b,c物理上分别放在不同的硬盘上

3。因为只有key的条件不用再作索引

newchar 2004-06-22
  • 打赏
  • 举报
回复
[就得考虑你的数据是不是得分区存储了] 什么意思?
qiansl 2004-06-18
  • 打赏
  • 举报
回复
支持 dinya2003(OK)
百分百好牛 2004-06-18
  • 打赏
  • 举报
回复
楼主用的是select * from a where .....
可是各位DD们用的都是select * from a,b,c where .....
为什么from后都是a,b,c啊?
偶是新手别笑我啊.
hllyq2000 2004-06-18
  • 打赏
  • 举报
回复
呵呵,看来这个JOIN问题已经有很多人来解决了,
如果select * from a,b,c where b.id = a.id and b.id = c.id 如果建立了索引之后速度还慢,那就得考虑你的数据是不是得分区存储了
adaizi1980 2004-06-17
  • 打赏
  • 举报
回复
支持楼上的,如果有索引,并且是建立在各个表的id字段上的,可能这就是最快的逻辑啦;不知道高手们还有没有更好的?
hot.wind 2004-06-17
  • 打赏
  • 举报
回复
查询速度的快慢与表结构和查询的目的相关,如果查询目的与a,b,c之间的对应关系比较确定,使用=条件比in条件要快的多。in条件是查询效率比较低的方法之一。
Paul_Ni 2004-06-17
  • 打赏
  • 举报
回复
你应该使用JOIN的概念来进行查询,而且要将数据量小的表作为判断条件的前半部分,这样,数据库只要所有数据量小的表就可以了
select * from a, b, c where b.id = a.id and b.id = c.id
tang800710 2004-06-17
  • 打赏
  • 举报
回复
首先确定A表在a_id字段上已建索引,B表a_id,b_id字段上已建索引,C表b_id字段上已建索引,然后把你上面的语句改成:
select * from A,B,C where A.a_id=B.a_id And B.b_id=C.b_id;
freddy2003 2004-06-17
  • 打赏
  • 举报
回复
2. 一般来说 NOT EXISTS 要比NOT IN 要快, 而EXISTS 却比IN要慢
对于EXISTS,只要子查询有记录,就会返回TRUE,并不会把子查询全部执行完毕。
而对于IN,是需要把子查询全部执行完毕,得到所有的结果后,再来一个一个比较。
freddy2003 2004-06-17
  • 打赏
  • 举报
回复
1. 查询速度的快慢与索引有很大的关系,你最好在表中建立索引
dinya2003 2004-06-17
  • 打赏
  • 举报
回复
在书上看了很多关于查询的文章,说法不一,但是楼主你这么写确实会很慢.根据我的测试,影响查询速度最大的因素是关联列的索引的使用,当然,in,(+)也会对查询有一定的影响.
首先建索引,比如在a_id,b_id字段上建索引,在然后
select
a.*
from
a,
b,
c
where
1=1
and b.a_id=a.a_id
and c.b_id=b.b_id
山水无言 2004-06-17
  • 打赏
  • 举报
回复
能不能将不使用in的完整句子写出来的呢?谢谢!

17,377

社区成员

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

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