大数量的数据删除的性能问题

本文探讨了大数据量表的高效删除方法,包括通过建立新表和使用存储过程进行批量删除的技术细节,并提供了具体实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

对于大数据量表的数据表的数据删除问题,总是有带来性能上的顾虑的。

 

那么对于这样的对一个大数据量表的大数据量的记录进行删除,我们有什么样的好方法呢。

 

对于这里的删除主要是io和cpu的考验了,而且delete语句也是不能去通过减少log来做的,所以这里没有其他更好的办法了。

 

这里采用的方法,基本上是

 

1.  建新表,插入需要的数据, 删除老表。

 

2.  用sp来做批量删除

 

 

sp的方式,这里摘录一个

 

 

引用:
create or replace procedure delBigTab 

p_TableName in varchar2, 
p_Condition in varchar2, 
p_Count in varchar2 

as 
pragma autonomous_transaction; 
n_delete number:=0; 
begin 
while 1=1 loop 
EXECUTE IMMEDIATE 
'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn' 
USING p_Count; 
if SQL%NOTFOUND then 
exit; 
else 
n_delete:=n_delete + SQL%ROWCOUNT; 
end if; 
commit; 
end loop; 
commit; 
DBMS_OUTPUT.PUT_LINE('Finished!'); 
DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!'); 
end;

 

 

 

引用:
SQL> set timing on 
SQL> select min(NUMDLFLOGGUID) from HS_DLF_DOWNLOG_HISTORY; 

MIN(NUMDLFLOGGUID) 
------------------ 
11000000 

Elapsed: 00:00:00.23 
SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11100000','10000'); 

PL/SQL procedure successfully completed. 

Elapsed: 00:00:18.54 
SQL> select min(NUMDLFLOGGUID) from HS_DLF_DOWNLOG_HISTORY; 

MIN(NUMDLFLOGGUID) 
------------------ 
11100000 

Elapsed: 00:00:00.18 
SQL> set serveroutput on 
SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11200000','10000'); 
Finished! 
Totally 96936 records deleted! 

PL/SQL procedure successfully completed. 

Elapsed: 00:00:18.61 
10万记录大约19s 

SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11300000','10000'); 
Finished! 
Totally 100000 records deleted! 

PL/SQL procedure successfully completed. 

Elapsed: 00:00:18.62 
SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11400000','10000'); 
Finished! 
Totally 100000 records deleted! 

PL/SQL procedure successfully completed. 

Elapsed: 00:00:18.85 
SQL> 
SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 13000000','10000'); 
Finished! 
Totally 1000000 records deleted! 

PL/SQL procedure successfully completed. 

Elapsed: 00:03:13.87 

100万记录大约3分钟 
SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 20000000','10000'); 

Finished! 
Totally 6999977 records deleted! 

PL/SQL procedure successfully completed. 

Elapsed: 00:27:24.69 
700万大约27分钟

 

 

可以把自制(pragma autonomous_transaction)事务去掉。 
而且这里没有rollback的处理,只是一个隐含的bug

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

inthirties

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值