我需要从表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;
我是否需要使用批量收集和删除?这样做的最佳方式是什么?
答案 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上的索引,首先要在一次传递中收集要删除的行的主键,然后循环遍历它们,使用批量收集或其他内容删除每次提交的批量大小记录可能更便宜。但是,如果可能的话,使用简单的解决方案总是很好的!您可能需要进行一些实验以找到最佳批量大小。