创建一个表: 记录rowid的分区段并作为处理的日志表:

DROP TABLE DEAL_TABLE_EXTENT;

CREATE TABLE DEAL_TABLE_EXTENT
(seq             number,
 OWNER           VARCHAR2(30),
 TABLE_NAME      VARCHAR2(30),
 EXTENT_ID       NUMBER ,     
 FILE_ID         NUMBER  ,    
 BLOCK_ID        NUMBER  ,     
 BLOCKS          NUMBER  ,    
 RELATIVE_FNO    NUMBER  , 
 MIN_ROWID       ROWID,
 NEXT_ROWID      ROWID,
 DEAL_FLAG       NUMBER  ,
 DEAL_ROW        NUMBER  ,
 BEGIN_TIME      DATE,
 END_TIME        DATE,
 ERR_MSG         VARCHAR2(2000)
);
comment on column DEAL_TABLE_EXTENT.DEAL_FLAG is '处理标志:0 正在处理,1 处理完成,-1 ' ;
comment on column DEAL_TABLE_EXTENT.DEAL_ROW is '该extent已经处理的记录数' ;
 
insert into DEAL_TABLE_EXTENT
 ( seq ,
   OWNER,
   TABLE_NAME,
   EXTENT_ID,
   FILE_ID,
   BLOCK_ID,
   BLOCKS,
   RELATIVE_FNO,
   MIN_ROWID
 )
 select rownum,
        owner,
        segment_name,
        EXTENT_ID,
        FILE_ID,
        BLOCK_ID,
        BLOCKS,
        RELATIVE_FNO,
        dbms_rowid.rowid_create(1, OBJ_ID,FILE_ID,BLOCK_ID,0)
   from (select owner,
                segment_name,
                EXTENT_ID,
                FILE_ID,
                BLOCK_ID,
                BLOCKS,
                RELATIVE_FNO,
                (select object_id from dba_objects where object_name='PAIM_FILE_STORAGE' and owner='EPCISIMSDATA') OBJ_ID
           from dba_extents
          where segment_name = 'PAIM_FILE_STORAGE'
          order by file_id, block_id);
commit ;
 
 create index ix_DEAL_TABLE_EXTENT_seq on DEAL_TABLE_EXTENT(seq);
 
UPDATE  DEAL_TABLE_EXTENT ATE1
SET NEXT_ROWID=(SELECT MIN_ROWID FROM  DEAL_TABLE_EXTENT ATE2 WHERE ATE2.SEQ=ATE1.SEQ+1) ;
    
commit ;
-----------最后一个extent 特殊处理 ----------------------
UPDATE  DEAL_TABLE_EXTENT ATE1
SET NEXT_ROWID= (select dbms_rowid.rowid_create(1, object_id,FILE_ID,BLOCK_ID+Blocks,0)  from dba_objects where object_name='PAIM_FILE_STORAGE' and owner='EPCISIMSDATA') 
where  NEXT_ROWID is null   ;
commit ;

创建存储过程,按ROWID分段处理

create or replace procedure push_paim_file_storage_1
is
---- PAIM_FILE_STORAGE 搬数据脚本
l_min_rowid rowid  ;
l_next_rowid rowid ;

Begin
  for i in (select seq,min_rowid,next_rowid from DEAL_TABLE_EXTENT
   where seq<50000 AND (deal_flag<>'1' OR deal_flag is null) order by seq)
   loop
     begin
     update DEAL_TABLE_EXTENT set BEGIN_TIME=SYSDATE WHERE SEQ=I.SEQ;
     insert /*+ append */ into epcisimsdata.paim_file_storage
       select * from epcisimsdata.paim_file_storage@TOCOWEPCISBS where rowid>=i.min_rowid and rowid<i.next_rowid;
      update DEAL_TABLE_EXTENT set deal_flag='1',END_TIME=SYSDATE WHERE SEQ=I.SEQ;
      COMMIT;
      exception when others then
      update DEAL_TABLE_EXTENT set deal_flag='0',END_TIME=SYSDATE WHERE SEQ=I.SEQ;
      end ;
   end loop ;

End ;

注意事项:

select rowid rid
,dbms_rowid.rowid_object(rowid) object_id
,dbms_rowid.rowid_relative_fno(rowid) fno
,dbms_rowid.rowid_block_number(rowid) block_num
,dbms_rowid.rowid_row_number(rowid) row_num
,PROGRAM_INTERFACE_TRACE.*
from PROGRAM_INTERFACE_TRACE sample block (0.001) order by rowed

可以看到, rowed的排序与FILE_ID也有关的, extend_id FILE_ID没有关系

ROWID的字符排 ROWID 本身排序是两回事, 不能同一样处理

select rownum rn, a.* from (select ROWIDTOCHAR(rowid) rid
,dbms_rowid.rowid_object(rowid) object_id
,dbms_rowid.rowid_relative_fno(rowid) fno
,dbms_rowid.rowid_block_number(rowid) block_num
,dbms_rowid.rowid_row_number(rowid) row_num,
 a.* from AJ50.AJ_JOBS a ) a order by rid

使用ROWIDTOCHAR 或者 CHARtoROWID转换

使用EXTEND方式来分段处理大表的搬数据的更多相关文章

  1. Oracle 删除大表中部分数据

    需求: 项目中有一张表大概有7000多万条数据,造成表空间已满,需要清理部分数据,打算清理3000万. 2B 做法: delete from table_name where ID > '400 ...

  2. oracle 大表 已有大数据量 建索引防卡 nologging

    create index idx_th_user_info_fans_name on th_user_info(fans_name) nologging;

  3. MySQL高级知识(十六)——小表驱动大表

    前言:本来小表驱动大表的知识应该在前面就讲解的,但是由于之前并没有学习数据批量插入,因此将其放在这里.在查询的优化中永远小表驱动大表. 1.为什么要小表驱动大表呢 类似循环嵌套 for(int i=5 ...

  4. SQL Server从读写频繁的大表中删除大批量数据

    如果我们直接用delete from语句来删除读写频繁的大表中的数据,很有可能会因为where的条件是全表扫描从而导致整个表被锁住了.如果该表是读写频繁的生产库那简直就是一场灾难,所有的线上读写请求都 ...

  5. oracle表连接——处理连接过程中另外一张表没有相关数据不显示问题

    一个数据表基本上很难满足我们的查询要求,同时,将所有的数据都保存在一个表格中显然也不是一种好的数据库设计,为了避免数据的冗余,删除.更新异常,我们通常需要建立一张外键表,通过表连接,来获取我们自己想要 ...

  6. 小表驱动大表, 兼论exists和in

    给出两个表,A和B,A和B表的数据量, 当A小于B时,用exists select * from A where exists (select * from B where A.id=B.id) ex ...

  7. 详解MySQL大表优化方案( 转)

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

  8. MySQL 大表优化方案探讨

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

  9. MySQL 对于大表(千万级),要怎么优化呢?

    http://www.zhihu.com/question/19719997 提问:如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说下该如何做,对于一个存储设计,必须 ...

随机推荐

  1. BZOJ 3674 可持久化并查集加强版 可持久化并查集

    题目大意:同3673 强制在线 同3673 仅仅只是慢了一些0.0 这道题仅仅写路径压缩比仅仅写启示式合并要快一点点 两个都写就慢的要死0.0 改代码RE的可能是内存不够 #include<cs ...

  2. eclipse开发c++时cout和endl报错

    1.Symbol 'cout' could not be resolved  , 选择kepler版本号就不报错了. 2. 下载gdb, ./configure make sudo make inst ...

  3. 第十一届GPCT杯大学生程序设计大赛完美闭幕

    刚刚过去的周六(6月7号)是今年高考的第一天,同一时候也是GPCT杯大学生程序设计大赛颁奖的日子,以下我们用图文再回想一下本次大赛颁奖的过程. 评审过程的一些花絮<感谢各位评审这些天的付出!&g ...

  4. 在 Mac OS X Lion 下修改 Hosts 的四种方法

    一名刚刚使用 Mac OS X Lion 系统的朋友问我怎么该系统下修改 Hosts 文件,说网上搜了很多办法都不管用,只要编辑 Hosts 文件就出现”你不是文件 hosts 的所有者,因此没有权限 ...

  5. 【SDK编程】

    #include <stdio.h> #include <windows.h> int main() { DeleteFile("C:\\test.txt" ...

  6. 什么是HTTP Keep-Alive呢?

    在通过调试工具查看网络请求的时候,通常在response header能看到类似下面这种:Keep-Alive: timeout=10, max=94 .那么Keep-Alive到底是什么呢? HTT ...

  7. 根据树父子ID拼接无限极树结构表的名称

    declare @c varchar(50)set @c='572a3d51-ef7a-459e-a5cd-ebf0fca51e8b' --能查出来呀 你试试,我试一下,好像可以啦谢谢 declare ...

  8. 修复CefSharp浏览器组件中文输入Bug

    概述 最近在win10上开发wpf应用,需要将CefSharp中wpf版本的浏览器组件(版本号v51.0.0)嵌入到应用中,但是发现不支持中文输入,GitHub上有这个问题的描述,参照其提到的方法可以 ...

  9. git撤销修改

    在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交: $ git add test.txt $ git commit -m "add test. ...

  10. Python的基础--对象

    对象(Objects)是python中数据的抽象,python中所有的数据均可以用对象或者是对象之间的关系来表示.每个对象均有标识符(identity).类型(type).值(value). 标识符. ...