客户要求我协助清理不要的历史数据,软件开发商提供了两条sql如下
delete from t_aging_analysis_history where fk_organization_id in (select pk_id from t_organization where organization_id like '114%')
delete from t_format_item_value_history where fk_organization_id in (select pk_id from t_organization where organization_id like '114%')
客户先是自己用plsql developer去执行,由于2条sql平均每条删除1.8亿条数据,undo表空间难以支持,而且事务过大,删除速度很慢,客户的操作以失败告终。
之前自己研究过这种场景的处理方法。
1.我先暂停了要大量删除数据的表的日志记录
-
alter table t_aging_analysis_history nologging;
2.参考网上的脚本,写自己的pl/sql
-
declare
-
cursor mycursor is select ROWID from t_aging_analysis_history where fk_organization_id in (select pk_id from t_organization where organization_id like \'114%\') order by rowid;
-
type rowid_table_type is table of rowid index by pls_integer;
-
v_rowid rowid_table_type;
-
BEGIN
-
open mycursor;
-
loop
-
fetch mycursor bulk collect into v_rowid limit 1000;
-
exit when v_rowid.count=0;
-
forall i in v_rowid.first..v_rowid.last
-
delete from t_aging_analysis_history where rowid=v_rowid(i);
-
commit;
-
end loop;
-
close mycursor;
-
END;
-
/
打开一个终端去执行,虽然拆分成多个事务,1000行提交一次,但是感觉速度很慢。
3.尝试使用parallel
-
SQL> ALTER TABLE t_aging_analysis_history PARALLEL(3);
-
ALTER TABLE t_aging_analysis_history PARALLEL(3)
-
*
-
ERROR at line 1:
-
ORA-12818: invalid option in PARALLEL clause
-
-
SQL> alter session disable parallel dml;
-
-
Session altered.
开启parallel的语句,当时没有记住,我让取消的存储过程继续执行,然后去翻官方文档。这时parallel没有真正的开启。
4.在官方文档发现如下内容,吓一跳
-
Note:
-
Parallel DML operations are not performed when the table lock of the target table is disabled.
字面上看,开启parallel是要获得表级锁,那么其他session是不是就不能做dml了呢?这个系统虽然业务量不大,可以白天清理,但是业务不能停啊。
5.是时候开启我的虚拟机了,使用了自制的test表,这个表的数据都是来源于emp表
第一个终端下:
-
SQL> alter table test parallel 2;
-
-
Table altered.
-
-
SQL> alter session enable parallel dml;
-
-
Session altered.
-
-
SQL> delete test where empno=7900;
-
-
1 row deleted.
第二个终端下:
-
SQL> delete test where empno=7902;
-
此时第二个终端会卡住。
开启第三个终端,看看:
-
SQL> select distinct BLOCKING_SESSION from v$session where blocking_session is not null;
-
-
BLOCKING_SESSION
-
----------------
-
41
真的有锁,开并行的session把test表整个锁住了,其他的session不能正常做dml了。
6.实验做完了,parallel最终没开,数据清理了,表还要开启日志记录的
-
alter table t_aging_analysis_history logging;
尝试了一把没用过的,差点影响业务。
骚年们,是时候查查官方文档了。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30202921/viewspace-1719015/
,如需转载,请注明出处,否则将追究法律责任。