数据量很大的两个表之间的连接问题!优化问题

LuLuT 2003-12-29 04:04:02
有两个表 a , b 其中a.id 为index ,是b.aid的外键
我在b表中建立b.aid的索引(a.id因为是主键所以为默认的索引)

两个表中的记录均为40多万条
建立视图 c: select a.*,b.* from a, b where a.id=b.aid
然后执行select * from c需要6、7秒的时间
请问如何提高效率?
如果是数据库的配置问题那么数据库的配置信息应如何设置呢?
...全文
462 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
leecooper0918 2003-12-29
  • 打赏
  • 举报
回复
如果数据更新比较频繁,要定期更新统计信息。
做一个job吧,定期更新.
LuLuT 2003-12-29
  • 打赏
  • 举报
回复
首先要非常感谢leecooper0918(爱一个人好难) 呵呵
我使用analyze table a compute statistics;
analyze table b compute statistics;
两条命令之后再执行select * from c 只需要2秒钟了
可是对这个统计的具体含义我还不太清楚 也不知道当数据变化后是否还有效
这个得查查看了 :p
leecooper0918 2003-12-29
  • 打赏
  • 举报
回复
首先, c是一个视图,而不是具体的表。 我没研究过oracle具体是
怎样对视图进行优化的,但是对表的查询优化基本有这么几个原则:

1. 例如 "select * from c where id != 0"这样的查询语句,是不会用上
索引的,如果id的取值不多,可以考虑建立bitmap index(OLTP类型的系统
不建议使用bitmap index)

2. select * from c则需要7秒
-------------------------
很正常,大表的连接代价是比较高的,关联匹配的数据量占
表的总数据量的多大? 如果比率很高的话,索引效率不会很好

3. 不是查询列上建立了索引,就一定会提高效率。有些情况下,全表扫描
的效率要高于索引.

4. 优化器是什么模式? 如果是rbo,要注意驱动表的位置.

5. 表和索引有没有进行过统计? 如果没有,先做一个统计
analyze table a compute statistics;
analyze table b compute statistics;

也可以只更新索引的统计信息,具体的查一下相关资料吧.

LuLuT 2003-12-29
  • 打赏
  • 举报
回复
而我用select * from c where id != 0 之类的条件却不会加快查询速度
select * from c where gender=1 需要3秒多的时间, 而gender字段也有索引

为什么差距这么大呢?
LuLuT 2003-12-29
  • 打赏
  • 举报
回复
发现奇怪的现象:
我再执行select * from c where where name like '陆%'的时候只需要耗时0.172秒(name 字段有索引)
可是如果不加条件的select * from c则需要7秒以上ft
请问有没有什么合理解释?
乐不 2003-12-29
  • 打赏
  • 举报
回复
我觉得这样的写法应该很ok的;
不过如果你不是需要a.*, b.*,只写出必要的字段,相信在响应时间上可以更快些,

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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