公司的oracle,数据库做BI,现在的问题是数据量非常大,250G以上,数据量10亿以上。
每天晚上跑ETL和一些存储过程,很多存储过程里面都有对临时表和事实表进行全部删除,插入,数据的动作,速度很慢
早上9点的时候还没有跑完,如果业务部门修改了历史数据,比如09年2月3日的数据,那历史数据都要变,我不知道关于这些大量数据的数据库,如何提高速度,请高人解答。
每天晚上跑ETL和一些存储过程,很多存储过程里面都有对临时表和事实表进行全部删除,插入,数据的动作,速度很慢
早上9点的时候还没有跑完,如果业务部门修改了历史数据,比如09年2月3日的数据,那历史数据都要变,我不知道关于这些大量数据的数据库,如何提高速度,请高人解答。
支持(1)避免在亿级表上执行delete/update
(2)insert记录到带有索引的表,如果不影响生产,则建议先删除索引,插入后再重建
(3)对于经常必须执行delete/update操作的大数据量表,可以定期exp/imp,drop掉后重建
(4)确保临时表空间、回滚段空间足够
1,这个目前尽量避免了
2.这个采纳,不过好像很多表没有索引,因为都是大量数据插入删除,所以没有索引
3.大表都是drop掉后重建,但是我不明白你说的exp/imp?请解释
4.这个目前我在验证,采纳,谢谢
1.服务器用的是磁盘柜,光纤的带宽最高达到2GB,据说这个是磁盘柜都这样,要是不用磁盘柜贷款是6GB
2.用的服务器是IBM的,用4块磁盘做raid2
3.oracle的缓存是不是够?
4.想做物理磁盘的分区,按照年份。
5.管服务器的同事说是贷款造成的,就是IO,数据量太大。
大家考虑下。谢谢
应该优化你存储过程的SQL语句
比如插入:
create table t(id int,firstname varchar(30),midname varchar(30),lastname varcha(30));
begin
for i in 1 .. 1000000 loop
insert into t values( i , 'liang' || i , 'hai' || i ,'qiang' || i);
end loop;
end;
/ declare
type tab_id is table of t.id%type index by binary_integer;
type tab_firname is table of t.firstname%type index by binary_integer;
type tab_midname is table of t.midname%type index by binary_integer;
type tab_lastname is table of t.lastname%type index by binary_integer; v_id tab_id;
v_fst tab_firname;
v_mid tab_midname;
v_last tab_lastname;
begin
for i in 1 .. 1000000 loop
v_id(i) := i;
v_fst(i) := 'liang' ||i;
v_mid(i) := 'hai' || i;
v_last(i) := 'qiang' || i;
end loop;
forall j in 1 .. 1000000
insert /*+ PARALLEL */ into t values(v_id(j),v_fst(j),v_mid(j),v_last(j));
end;
/下面种速度大概是上面的30到40倍比如删除
若不是实时更新的数据,比如日子:
在大数据量删除时候(有1000W条数据,删除其中的990W条时候),使用delete的时候完全可以
用truncate替代删除数据,当然在truncate前把你要保留的数据插入一个新表中,再truncate你要删除的表,然后用insert into testTab select * from tmpTab;把数据导入那个表等等,sql中的编写技巧
建议先检查那个存储过程