在oracle中清除数百万数据的最佳实践

时间:2016-09-01 10:49:13

标签: oracle

我需要从表tblmail记录前10年获得10亿个数据,因为我创建了以下程序。 我正在通过批量大小。

CREATE OR REPLACE PROCEDURE PURGE_Data AS 
 batch_size INTEGER := 1000;
 pvc_procedure_name        CONSTANT VARCHAR2(50) := 'Purge_data';
 pvc_info_message_num      CONSTANT NUMBER := 1;
 pvc_error_message_type    CONSTANT VARCHAR2(5) := 'ERROR';
v_message    schema_mc.db_msg_log.message%TYPE;
v_msg_num    schema_mc.db_msg_log.msg_num%TYPE;
/*
    Purpose: Provide stored procedures to be used to purge unwanted archives.
*/
BEGIN
Delete from tblmail where createdate_dts < (SYSDATE - INTERVAL '10' YEAR) and ROWNUM <= batch_size;
COMMIT;      
EXCEPTION  
          WHEN OTHERS THEN
                     ROLLBACK;
                     v_msg_num := SQLCODE;
                     v_message := 'Error deleting from tblmail table';
                     INSERT INTO error_log
                             (date, num, type, source, mail)
                         VALUES              
                             (systimestamp, v_msg_num, pvc_error_message_type,pvc_procedure_name, v_message);
                     COMMIT;      
END;

我是否需要使用批量收集和删除?这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:0)

总是在计算中它取决于。如果您在createdate_dts上有索引,那么您的过程应该有效,但是您怎么知道何时停止调用它?我倾向于使用循环:

loop
  delete /*+ first_rows */ from tblmail where createdate_dts <
    (SYSDATE - INTERVAL '10' YEAR) and ROWNUM <= batch_size;
  v_rows := SQL%ROWCOUNT;
  commit;
  exit when v_rows = 0;
end loop;

如果要将循环保留在过程之外,也可以返回已删除记录的数量。如果没有createdate_dts上的索引,首先要在一次传递中收集要删除的行的主键,然后循环遍历它们,使用批量收集或其他内容删除每次提交的批量大小记录可能更便宜。但是,如果可能的话,使用简单的解决方案总是很好的!您可能需要进行一些实验以找到最佳批量大小。