我有四张表,表t1,t2,t3,t4。
其中表t1与t2,t3,t4相关联。删记录的时候t2,t3,t4很快,t1非常慢。
具体是这样:
现在各表各有170万条左右记录,每天还以10万条左右的记录往里写。与此同时,我想删旧的记录,但是现在删表t1太慢,用SQL语句试了一下,从t1删一条记录用时8秒!!!!请高手指教!!!!

解决方案 »

  1.   

    如果要全部删除就禁止外键 truncate掉把
      

  2.   

    t1表有没有外键,有没有索引?
    有的话肯定会慢的
    如果要删除所有数据就用truncate table t1会更好
      

  3.   

    1.做一个存贮过程,删除符合条件的表,表中对日期字段和sysdate相比较;
    2.在JOB中定时(最好在每天凌晨3:00)执行。
      

  4.   

    TRANSCATE tablename 就是把所有的记录删掉,不删表结构,DROP TABLENAME;才是删除表结构啊。
      

  5.   

    本帖最后由 liuyi8903 于 2008-11-09 23:17:27 编辑
      

  6.   

    楼主的意思是应该不影响向这个表中写入新数据,应该不能这样操作。我也觉得写个存储过程然后再加个JOB,每个小时删除24小时前的数据就行了。
      

  7.   

    存储过程很简单。这个是删除每24小时前的数据,你再添加一个JOB就行了,每1小时执行一次。这个是存储过程
    CREATE OR REPLACE PROCEDURE DeleteTest
    AS
    BEGIN
    DELETE FROM TABLE WHERE 时间字段<trunc(sysdate)-1;COMMIT;
    END DeleteTest;
    /这个是JOB
    DECLARE
      X NUMBER;
    BEGIN
      SYS.DBMS_JOB.SUBMIT
        ( job       => X 
         ,what      => 'CARTE.INSERTWEIGHT;'
         ,next_date => to_date('12-11-2008 08:00:00','dd/mm/yyyy hh24:mi:ss')
         ,interval  => 'TRUNC(SYSDATE+1)+1/24'
         ,no_parse  => TRUE
        );
      SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
    END;
    /commit;
      

  8.   

    比如我曾经写过一段:SQL> declare
      2    cursor l_cur is
      3      select rowid from aa;
      4  
      5    type ridArray is table of rowid index by binary_integer;
      6  
      7    l_rowid ridArray;
      8  begin
      9    open l_cur;
     10    loop
     11      fetch l_cur bulk collect
     12        into l_rowid limit 10000;
     13  
     14      forall i in 1 .. l_rowid.count
     15        delete from aa where rowid = l_rowid(i);
     16      commit;
     17  
     18      exit when l_cur%notfound;
     19    end loop;
     20    close l_cur;
     21  end;
     22  /