删除231万数据2-3分钟的过程

这个语句根据ROWID

create or replace procedure delBigTab
(
p_TableName       in    varchar2,
p_Condition       in    VARCHAR2
)
AS
type mycur is ref cursor;
        v_cur     mycur;
v_cur_sql VARCHAR2(2000);
l_sql VARCHAR2(2000);
pragma autonomous_transaction;
n_delete number:=0;
 Type v_rowid is table of varchar2(100) index by binary_integer;
 var_rowid v_rowid;
BEGIN
v_cur_sql :='select rowid from '||p_TableName||' where '||p_Condition||' order by rowid' ;
OPEN v_cur FOR v_cur_sql;
LOOP
FETCH v_cur BULK COLLECT
                INTO var_rowid LIMIT 20000 ;
FORALL i IN 1 .. var_rowid.count
/* DELETE FROM datasync_prc.ax_log_mail WHERE ROWID=var_rowid(i);*/
EXECUTE IMMEDIATE  'delete from '||p_TableName||' where  rowid=:1' USING var_rowid(i);
COMMIT;
EXIT WHEN v_cur%NOTFOUND OR v_cur%NOTFOUND IS NULL;
END LOOP;
CLOSE v_cur;
end;

 

第二个 根据rownum 限制数据量来删除

create or replace procedure delete_big_table(pi_table_name in varchar2,pi_condition in varchar2) is
pragma autonomous_transaction;
lv_delete_sql varchar2(2000);
lv_select_sql varchar2(2000);
ln_delete_num number;
type mycur is ref cursor;
        v_select_cur     mycur;
        v_delete_cur     mycur;
begin
   ln_delete_num:=0;
    lv_select_sql:=' select count(1) from '||trim(pi_table_name)||' where '||pi_condition;
    open v_select_cur for lv_select_sql;
       fetch v_select_cur into ln_delete_num;
    close  v_select_cur;

    lv_delete_sql:=' DELETE '||trim(pi_table_name)||' where rownum<=:num_count and '||pi_condition;
   
    while 1=1 loop
          execute immediate lv_delete_sql using 2000;
          ln_delete_num:=ln_delete_num-2000;
          commit;
          EXIT WHEN  ln_delete_num <=0;
    end loop;

end delete_big_table;

 

测试删除

TABLE_NAME            MAX(NUM_ROWS)
TEMP_WUND_ACTION       2328150

TEMP_WUND_ACTION 复制下面两张表

     analyze table TEMP_WUND_ACTION_01 compute statistics;

     analyze table TEMP_WUND_ACTION_02 compute statistics;

并做分析

TABLE_NAME            MAX(NUM_ROWS)

TEMP_WUND_ACTION_02    2315417
TEMP_WUND_ACTION_01    2315417

 

分别执行

execute delete_big_table('TEMP_WUND_ACTION_01','1=1'); 为166.625秒

execute delBigTab('TEMP_WUND_ACTION_02','1=1');为116.141秒

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值