在我们迁移数据,或者进行同步数据的时候,对于应用变更频繁的表进行抽取数据,经常会碰到oracle需要读取回滚段,会导致很慢,有时候甚至会报ora01555错误,
比如我们有个表比较大是40G左右,就是一个月的按月分区数据,这个时候如果想尽快抽取数据到另外一个库,有几种方法:
方法1:
大家都知道的使用append,然后不写日志,parallel抽取方式:
代码类似如下:
alter session enable parallel DML;
ALTER SESSION SET db_file_multiblock_read_count=128;
INSERT /*+append parallel(b 2)*/
INTO OS_USER_SERVICE_HIS_1 b
SELECT /*+FULL(a) PARALLEL(A,2)*/
* FROM OS_USER_SERVICE_HIS A
WHERE CREATETIME >= TO_DATE('20110906', 'yyyymmdd');
方法2:
开4个会话:
通过createtime逻辑上进行4个时间区间的并行处理:比如一个月的话,分成1会话处理第一周,然后一直到4会话处理第4周
,当然你也可以再细分:1会话写循环一小时一小时处理。
方法3:
使用rowid并行:
这里我重要说下使用rowid并行的方法:
真实案例:
create table ROWID_OS_USER_BEHAVIOR_201212
(
ID NUMBER,
ROWID_MIN VARCHAR2(32),
ROWID_MAX VARCHAR2(32),
FLAG NUMBER
);
首先创建rowid保存表:
获取远程库的data_object_id:
SQL> select data_object_id from Dba_objects@mail139.localdomain where object_name='OS_USER_BEHAVIOR_MONTH' and subobject_name='OS_USER_BEHAVIOR_MONTH2012M12'
2 ;
DATA_OBJECT_ID
--------------