公司的oracle,数据库做BI,现在的问题是数据量非常大,250G以上,数据量10亿以上。
每天晚上跑ETL和一些存储过程,很多存储过程里面都有对临时表和事实表进行全部删除,插入,数据的动作,速度很慢
早上9点的时候还没有跑完,如果业务部门修改了历史数据,比如09年2月3日的数据,那历史数据都要变,我不知道关于这些大量数据的数据库,如何提高速度,请高人解答。
------解决方案--------------------
250G还算可以,应该是朝九晚五的业务系统。
给几个建议,不过一般来说,应该是已经都这么做了,呵呵:
1:保持数据更新时在数据上打时间戳,只要业务数据发生了写(改)动作,都打上一个时间戳标记变化时间
业务数据应该不会有删除这个说法。
这样抽取数据的时候,只要抽取某一个时间戳后的数据即可。
另外,抽取后的数据带两个戳,一个是抽取时数据带的时间戳,另外就是当前抽取时的时间戳。
这样后面查异常数据的时候好查。
2:“对临时表和事实表进行全部删除”,全部删除不要用Delete,用Truncate table
如果事实表上有索引,写入数据前,先把索引去掉,数据写入后,再重新生成索引
整个过程比带索引写入要快很多
另外就是对数据进行分区。这个应该就更不用说了。。
3:理论上讲,如果单纯的抽取时间过程,能从次日凌晨0:00开始抽,假设抽到7点,那7个小时的时间,可以抽取N亿条数据了。
但是如果抽取后,还带着其他的业务处理,那么时间就拿不准了。
所以建议把抽取和进一步处理分开,先保证在下一个业务区间来临时,把上一业务区间变化的数据抽好,再做其他的处理。这样即使是第2天已经上班业务数据又发生了新的变化,也不会再影响到上一区间的结果。
4:抽取的时候不要一次性全部抽,比如可以分公司(或者地域)区间的,一家公司一家公司抽。
这样的速度一般比一次性全部抽取要快一些。