删除大数据量表的列的一个好方法

来源:互联网 发布:hp1216网络扫描驱动 编辑:程序博客网 时间:2024/05/17 09:29

很多开发的朋友可能遇到过这样的情况:一个数据量很大的表,业务需要添加一个字段(添加字段很快),在测试环境测试以后,还想再做一遍,就需要删除这个字段,这时纠结的问题发生了:删除字段是如此漫长,而且最后经常会无缘无故中断了,白花花的几个小时就这么浪费了,还搞的心情很烦躁。。。。今天发现了一个好方法,这里跟大家分享一下:造成删除字段失败的很大原因是回滚段被耗尽,下面看看我的测试:

1. 建两个结构和数据量一样的表test2,test3,数据量约为500W;

2. 用一般的方法去删除字段:

SQL> alter table test2 drop column object_id

3. 用sql观察回滚段的使用情况:

SELECT T.TABLESPACE_NAME,
       T.STATUS,
       ROUND(SUM(T.BYTES)/1024/1024,2) UNDO_SIZE
  FROM DBA_UNDO_EXTENTS T
 GROUP BY T.TABLESPACE_NAME,T.STATUS;

你会发现ACTIVE状态的回滚区越来越多,逐渐耗尽undo空间,最后耗时2分15秒

4. 用新方法删除字段

SQL> alter table test3 drop column object_id checkpoint 100000;

sql的意思是没10W笔记录会提交一次,释放回滚段,再用上面的sql观察active状态的回滚段,你会发现每当ACTIVE增长到一定的值后又变小了,就说明回滚段在不断回收active状态的区,同时增大UNEXPIRED和EXPIRED状态的区。要知道UNEXPIRED和EXPIRED状态的区是可以重新利用的,而active状态的区是不能够重新利用。从而保证了回滚段不会被撑爆。

最后耗时2分10秒,虽然时间没有提高多少,起码可以降低白白等上几个小时后操作失败的风险。。。。。。

原创粉丝点击