4
回答
Oracle 大数据量表查询效率问题,求解答?

数据库:Oracle

现有3张业务表,每张表的数据量已达千万近亿,目标数据需要这三张表联合查询才能得到结果,但是目前联合查询,而且只获取本月份的数据,耗时一分多都还没出结果。


select f.pat_id, f.series, f.name, f.ward_code, f.dept_code, n.node_code, 
case when instr(n.string_value, '级') != 0 then substr(n.string_value, 0, instr(n.string_value, '级')-1) else substr(n.string_value, 0, 1) end as s_value, 
r.nursing_record, r.user_str from A f, B n, C r
where f.id = n.form_id and f.form_id = r.nursing_record_id and r.delete_flag = 0 and f.created_date >= to_date('2014-07-01', 'yyyy-MM-dd')
and (n.node_code in (3725, 3726, 3727, 3728, 3729)
or n.node_code in (3765, 3766, 3767, 3768, 3769)
or n.node_code in (3790, 3791, 3792, 3793, 3794));

现在我拆分3步走,第一步执行的sql是:

select * from C where delete_flag = 0 and record_time >= to_date('2014-07-01','yyyy-MM-dd');

但是就是这条sql,目前在PL/SQL里面查询耗时1分50秒,都近2分钟了,而且record_time是有建立索引的。这么慢的速度,怎能忍受呀?而且这三张表,操作都是比较频繁的。

请各位大神指点一二,看看怎么优化下,效率会提升?下面两点是我的疑问和业务要求。

a> 据说建立分区存本地索引,提高的只是大数据的存储效率,那么关于检索呢

b> 该项目已上线有近4年了,13年以前的数据可以不管,但是14年是必须得统计出来的




举报
streamlong
发帖于4年前 4回/2K+阅
共有4个答案 最后回答: 4年前
关键是做表分区,另外长时间不用的历史数据要移到备份表中。如何分具体的还要看你的业务的情况
--- 共有 1 条评论 ---
streamlong我知道分区有好几种类型,那么不同的分区,检索的效率也高低不同?我关注的还是检索速度。。。 4年前 回复
你确定这个C 不是一个试图而且试图关联了多张表?单张表应该不会这么慢
--- 共有 1 条评论 ---
streamlong确定,是单张表,但是数据量现在已经有千万,快到亿了,而且我查询的条件,record_time是建立索引了的 4年前 回复
单张表它的时间没有索引会有这么慢的。做一下全表分析,时间上加个索引,或者按时间进行表分区会有效果,表分区的主要目的是将原来的数据分成多个不同的区存储,索引时根据查询条件决定在哪个分区中进行数据查询,1亿条数据一般查询在无索引的情况下绝对过分钟,但你分100个区,实际上消夏的时间是决定这个条件到哪个区查询的时间+那个100万条记录的查询时间,而前面那个基本是没有时间消耗的。关键是要合理选择分区的依据。
--- 共有 2 条评论 ---
len 你的数据是不是经常有删除,如果有的话要定期做一下表分析。如果你现在有索引还走全表,建议你把索引删除了,重建一下。注意选择实施时间,不要影响业务 4年前 回复
streamlong嗯,我之前也是这么理解的,但是同事说查询走的还是全表,我瞬间就不知道分区的目的在哪儿了。谢谢解惑。。。。现在表还没有建立分区,正考虑建立分区,但是时间字段是有索引的 4年前 回复
顶部