delete大量数据,并尝试开并行

客户要求我协助清理不要的历史数据,软件开发商提供了两条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.我先暂停了要大量删除数据的表的日志记录

点击(此处)折叠或打开

  1. alter table t_aging_analysis_history nologging;

2.参考网上的脚本,写自己的pl/sql

点击(此处)折叠或打开

  1. declare
  2. 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;
  3. type rowid_table_type is table of rowid index by pls_integer;
  4. v_rowid rowid_table_type;
  5. BEGIN
  6. open mycursor;
  7. loop
  8. fetch mycursor bulk collect into v_rowid limit 1000;
  9. exit when v_rowid.count=0;
  10. forall i in v_rowid.first..v_rowid.last
  11. delete from t_aging_analysis_history where rowid=v_rowid(i);
  12. commit;
  13. end loop;
  14. close mycursor;
  15. END;
  16. /
打开一个终端去执行,虽然拆分成多个事务,1000行提交一次,但是感觉速度很慢。

3.尝试使用parallel

点击(此处)折叠或打开

  1. SQL> ALTER TABLE t_aging_analysis_history PARALLEL(3);
  2. ALTER TABLE t_aging_analysis_history PARALLEL(3)
  3. *
  4. ERROR at line 1:
  5. ORA-12818: invalid option in PARALLEL clause
  6. SQL> alter session disable parallel dml;
  7. Session altered.
开启parallel的语句,当时没有记住,我让取消的存储过程继续执行,然后去翻官方文档。这时parallel没有真正的开启。

4.在官方文档发现如下内容,吓一跳

点击(此处)折叠或打开

  1. Note:
  2. Parallel DML operations are not performed when the table lock of the target table is disabled.
字面上看,开启parallel是要获得表级锁,那么其他session是不是就不能做dml了呢?这个系统虽然业务量不大,可以白天清理,但是业务不能停啊。

5.是时候开启我的虚拟机了,使用了自制的test表,这个表的数据都是来源于emp表
第一个终端下:

点击(此处)折叠或打开

  1. SQL> alter table test parallel 2;
  2. Table altered.
  3. SQL> alter session enable parallel dml;
  4. Session altered.
  5. SQL> delete test where empno=7900;
  6. 1 row deleted.
第二个终端下:

点击(此处)折叠或打开

  1. SQL> delete test where empno=7902;

此时第二个终端会卡住。
开启第三个终端,看看:

点击(此处)折叠或打开

  1. SQL> select distinct BLOCKING_SESSION from v$session where blocking_session is not null;
  2. BLOCKING_SESSION
  3. ----------------
  4. 41
真的有锁,开并行的session把test表整个锁住了,其他的session不能正常做dml了。

6.实验做完了,parallel最终没开,数据清理了,表还要开启日志记录的

点击(此处)折叠或打开

  1. alter table t_aging_analysis_history logging;

尝试了一把没用过的,差点影响业务。
骚年们,是时候查查官方文档了。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30202921/viewspace-1719015/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30202921/viewspace-1719015/

你可能感兴趣的:(delete大量数据,并尝试开并行)