公司的oracle,数据库做BI,现在的问题是数据量非常大,250G以上,数据量10亿以上。
每天晚上跑ETL和一些存储过程,很多存储过程里面都有对临时表和事实表进行全部删除,插入,数据的动作,速度很慢
早上9点的时候还没有跑完,如果业务部门修改了历史数据,比如09年2月3日的数据,那历史数据都要变,我不知道关于这些大量数据的数据库,如何提高速度,请高人解答。

解决方案 »

  1.   

    给表加上1000个分区,根据哈希排列,尽可能选择个数据量分布均匀的字段来做分区字段,事实表和临时表可根据实际情况采用不同字段分区,临时表清空时用truncate 10亿的数据操作一般在1-3小时内就能搞定
      

  2.   


    支持(1)避免在亿级表上执行delete/update
    (2)insert记录到带有索引的表,如果不影响生产,则建议先删除索引,插入后再重建
    (3)对于经常必须执行delete/update操作的大数据量表,可以定期exp/imp,drop掉后重建
    (4)确保临时表空间、回滚段空间足够
      

  3.   

    若能优化下SQL、索引之类的就更好.
      

  4.   

    很有用,谢谢,
    1,这个目前尽量避免了
    2.这个采纳,不过好像很多表没有索引,因为都是大量数据插入删除,所以没有索引
    3.大表都是drop掉后重建,但是我不明白你说的exp/imp?请解释
    4.这个目前我在验证,采纳,谢谢
      

  5.   

    其实我现在还这样考虑:
    1.服务器用的是磁盘柜,光纤的带宽最高达到2GB,据说这个是磁盘柜都这样,要是不用磁盘柜贷款是6GB
    2.用的服务器是IBM的,用4块磁盘做raid2
    3.oracle的缓存是不是够?
    4.想做物理磁盘的分区,按照年份。
    5.管服务器的同事说是贷款造成的,就是IO,数据量太大。
    大家考虑下。谢谢
      

  6.   

    我认为现在的问题不是BI工具的问题了,应该涉及到了DBA的一些优化问题了,推荐问问你们那里的DBA,将语句优化下,或者对更新数据进行merge操作。或者insert的时候用/*+APPEND+*/
      

  7.   

    建立一个索引表,再根据时间把大表分成很多个表,每个表控制在50W一下,这样可以加快查询的速度
    应该优化你存储过程的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中的编写技巧
    建议先检查那个存储过程