客户要求我协助清理不要的历史数据,软件开发商提供了两条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.我先暂停了要大量删除数据的表的日志记录
2.参考网上的脚本,写自己的pl/sql
打开一个终端去执行,虽然拆分成多个事务,1000行提交一次,但是感觉速度很慢。
3.尝试使用parallel
开启parallel的语句,当时没有记住,我让取消的存储过程继续执行,然后去翻官方文档。这时parallel没有真正的开启。
4.在官方文档发现如下内容,吓一跳
字面上看,开启parallel是要获得表级锁,那么其他session是不是就不能做dml了呢?这个系统虽然业务量不大,可以白天清理,但是业务不能停啊。
5.是时候开启我的虚拟机了,使用了自制的test表,这个表的数据都是来源于emp表
第一个终端下:
第二个终端下:
此时第二个终端会卡住。
开启第三个终端,看看:
真的有锁,开并行的session把test表整个锁住了,其他的session不能正常做dml了。
6.实验做完了,parallel最终没开,数据清理了,表还要开启日志记录的
尝试了一把没用过的,差点影响业务。
骚年们,是时候查查官方文档了。
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;
- /
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.
4.在官方文档发现如下内容,吓一跳
点击(此处)折叠或打开
- Note:
- Parallel DML operations are not performed when the table lock of the target table is disabled.
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
6.实验做完了,parallel最终没开,数据清理了,表还要开启日志记录的
点击(此处)折叠或打开
- alter table t_aging_analysis_history logging;
尝试了一把没用过的,差点影响业务。
骚年们,是时候查查官方文档了。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30202921/viewspace-1719015/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30202921/viewspace-1719015/