用vc ado编程删除数个表中一个月前的记录,用delete删符合时间条件的记录,太慢了,而且有一个跟其他表关联的表,十几万条记录,我的程序删了一周还没完!!!!
而且删了记录并没有释放空间!!再搞不定服务器就要死了,老板已经怒了。
各位帮帮忙,我是数据库菜鸟。

解决方案 »

  1.   

    数据删除了,oracle占用的系统磁盘空间不会释放的。只是表空间的free空间增加。
    大量数据的删除,可以考虑分批删除、提交。
      

  2.   

    另外把你的v$session_wait中你执行 sql的那个session的等待事件也帖出来
      

  3.   

    1.对完全删除的表可以使用:truncate table 表名;它可以释放占用的数据块表空间,但此操作不可回退。 而使用delete删除记录不能释放Oracle里被占用的数据块表空间,它只把那些被删除的数据块标成unused。 2.各表要建立索引;3.可以在sqlplus、pl/sql或toad中使用sql语句直接删除,比用vc ado编程删除要快些。
      

  4.   

    十几万的记录删除这么久!表的结构设计是不是问题
    贴表结构和删除的SQL语句!
      

  5.   

    我的表结构大致如下:
    表一:CUS.INFO(ID,AGE,TIME,SERVICE)
    表二:CUS,INFO_SET(ID,INFO_ID,PASSWORD)
    表三:CUS.INFO_FILE(ID,INFO_ID,FILE_NAME,FILE_POSITION)
    后两张表的INFO_ID与表一的ID关联。首先删表二、表三
    sql语句分别为:
    delete from INFO_SET where INFO_ID in(select id from INFO where TIME BETWEEN 1 and xxxxxxxxx); 
    delete from INFO_FILE where INFO_ID in(select id from INFO where TIME BETWEEN 1 and xxxxxxxxx); 
    xxxxxxxxx是符合条件的时间。
    最后删表一
    delete from INFO where TIME BETWEEN 1 and xxxxxxxxx;表二、表三很快,表一很慢,测试过,肯定是能用,一万条记录我测试过,用了两分钟。另外,我删旧数据的同时,别人还在往这几张表插入新的记录。
    释放存储空间如何解决?
      

  6.   

    10 万条一个礼拜还没有删除完,赶快检查你的
    ALert.log文件,看看有没有出错信息,估计是hung死了
      

  7.   

    我曾经遇到过和你相似的情况,用得是DELPHI,不过数据量比你大得多,也没你那么慢~
    我当时的情况是删除一年的数据(千万级),一次要删除十几个小时。
    我采取的办法是一:做了一个循环,一年分成12个月,一个月一个月分批删除;
                  二:根据你这些语句,你这2个表肯定是有主外建关联的,如非必要,建议取消关联,速度会提升很多;
    我的一点个人经验,希望能对你有所帮助delete from INFO_SET where INFO_ID in(select id from INFO where TIME BETWEEN 1 and xxxxxxxxx); 
    delete from INFO_FILE where INFO_ID in(select id from INFO where TIME BETWEEN 1 and xxxxxxxxx
      

  8.   


    /--先作一个存贮过程:CREATE OR REPLACE PROCEDURE User1.pro_del AS
    begin  delete from INFO_SET
       where INFO_ID in
             (select id from INFO where TIME BETWEEN 1 and xxxxxxxxx);
      delete from INFO_FILE
       where INFO_ID in
             (select id from INFO where TIME BETWEEN 1 and xxxxxxxxx);
      delete from INFO where TIME BETWEEN 1 and xxxxxxxxx;END;
    /--再作一个JOB:begin
      sys.dbms_job.submit(job => :job,
                          what => 'User1.pro_del;',
                          next_date => to_date('18-10-2008', 'dd-mm-yyyy'),
                          interval => 'TRUNC(SYSDATE+1)');
      commit;
    end;
    /
      

  9.   

    14楼的 我用vc写的 有vc代码吗 或者只给我sql语句也行 谢谢
      

  10.   

    你得查找你数据库的原因...10多W条数据怎么可能一个月删除不完?
    你的表肯定有问题了......找下v$session_wait 等待事件..
      

  11.   

    为何一定要用vc程序来写呢?
    在数据库中执行比用程序执行的效率要高。且楼主在8楼说"每天都要定时删",使用JOB定时执行是最简捷的,用vc基本上做不了的。