大表中海量历史数据的更新与删除一直是令DBA非常头痛的事情,在表已经分区的前提下我们还可以利用并行或者truncate parition等手段来为UPDATE或者DELETE提速, 但是如果对象是普通的非分区对表(non-partitioned heap table)的话,似乎就没有太好的加速方法了, nologging或parallel 对非分区表都没有效果。 之前我也有介绍过一个利用rowid将非分区表分割成指定数量个区间块的方法,
见<Script:partition table into rowid extent chunks>
;利用该脚本可以获取到这些分割后的区间块的起始rowid和结尾rowid,之后利用between start_rowid and end_rowid的条件构造多条DML语句, 因为这些DML语句所更新的数据都是在互不相关的区间内的,所以可以在多个终端内并行地运行这些DML语句,而不会造成锁的争用或者Oracle并行执行协调(Parallel Execution coordinator ) 所带来的一些开销。 为了加深理解,我们来实践一下<Script:partition table into rowid extent chunks>中提到的方法:
CORE
本文转自maclean_007 51CTO博客,原文链接:
http://blog.51cto.com/maclean/1278229