场景描述:
Oracle数据库中有2张表,一张是tm_bus_realtime_log当前表 只有当前一天的数据。数据量有几百万的数据。还有一张表,tm_bus_realtime_his历史表 进行了分区。每10天一分区,就是每个月有3个分区。整个历史表有几亿的数据量。每个分区有千万条数据。
问题描述:
在从历史表的分区中,查询数据时,很慢,由于数据量非常大,如果想查询几天的数据更慢?应该如何提高查询的速度?
在论坛上发了一个关于这方面的一个帖子,非常感谢留下意见的人,一些好的建议如下:
1 改成一天一个分区
2 对历史数据 进行清理,比如只保存2年的数据
3 依据计划看看索引建的合适不
4 如果你的查询条件中,除了时间,如果还有其他的字段,那就要相应的建上本地索引
5 如果历史表数据不更改的话,可以考虑在时间字段建立一个trunc(XX)位图函数索引,查询的时候再指定分区。
6 表分区、那索引分区
7 依据where条件而定。
我的一些做法:
其实就是想做两个界面,把需要的一些综合信息查询出来进行展示,这些信息数据量很大。进行了分区。但是查询出来显示的时候,当天一天的数据还可以,但是一但垮天,跨分区之后,就查询的速度特别的慢。
1 对于当前表tm_bus_realtime_log。查看它的索引,只有一个(索引名:INDEX_BUS_REALTIME 字段名:UPLOAD_TIME)
而我的查询SQL里面的条件里面有2个字段,一个是bus_no,一个是upload_tiime,应该把索引字段紧跟到where条件后。
2 对于查询出来的数据,不要使用*,最好是具体的字段。
3 在plsql里面按F5,对该SQL语句,看一下它的执行计划,看是进行的全表扫描,还是走的索引。
4 索引不适合建立很多,多了,也会影响查询效率。当时就把其中一个没用的多余的索引删除了。速度也就快了。
5 尽量不要使用in。使用exists.
6 优化代码。
现在查询出来的数据快多了!