通过rowid逻辑并行抽取数据

本文介绍了在Oracle数据库中,为了解决大表数据抽取速度慢的问题,提出三种方法:1) 使用APPEND和PARALLEL选项;2) 分区并行处理;3) 利用ROWID并行抽取。通过案例详细解析了ROWID并行抽取的步骤,包括创建ROWID保存表、获取远程库的ROWID范围,并编写存储过程实现多会话并行拉取数据,从而显著提高30G数据的抽取效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我们迁移数据,或者进行同步数据的时候,对于应用变更频繁的表进行抽取数据,经常会碰到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
--------------
  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值