使用EXTEND方式来分段处理大表的搬数据
创建一个表: 记录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方式来分段处理大表的搬数据的更多相关文章
- Oracle 删除大表中部分数据
需求: 项目中有一张表大概有7000多万条数据,造成表空间已满,需要清理部分数据,打算清理3000万. 2B 做法: delete from table_name where ID > '400 ...
- oracle 大表 已有大数据量 建索引防卡 nologging
create index idx_th_user_info_fans_name on th_user_info(fans_name) nologging;
- MySQL高级知识(十六)——小表驱动大表
前言:本来小表驱动大表的知识应该在前面就讲解的,但是由于之前并没有学习数据批量插入,因此将其放在这里.在查询的优化中永远小表驱动大表. 1.为什么要小表驱动大表呢 类似循环嵌套 for(int i=5 ...
- SQL Server从读写频繁的大表中删除大批量数据
如果我们直接用delete from语句来删除读写频繁的大表中的数据,很有可能会因为where的条件是全表扫描从而导致整个表被锁住了.如果该表是读写频繁的生产库那简直就是一场灾难,所有的线上读写请求都 ...
- oracle表连接——处理连接过程中另外一张表没有相关数据不显示问题
一个数据表基本上很难满足我们的查询要求,同时,将所有的数据都保存在一个表格中显然也不是一种好的数据库设计,为了避免数据的冗余,删除.更新异常,我们通常需要建立一张外键表,通过表连接,来获取我们自己想要 ...
- 小表驱动大表, 兼论exists和in
给出两个表,A和B,A和B表的数据量, 当A小于B时,用exists select * from A where exists (select * from B where A.id=B.id) ex ...
- 详解MySQL大表优化方案( 转)
当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...
- MySQL 大表优化方案探讨
当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...
- MySQL 对于大表(千万级),要怎么优化呢?
http://www.zhihu.com/question/19719997 提问:如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说下该如何做,对于一个存储设计,必须 ...
随机推荐
- HttpContext详解【转】
HttpContext 类:封装有关个别 HTTP 请求的所有 HTTP 特定的信息. 在处理请求执行链的各个阶段中,会有一个对象在各个对象之间进行传递,也即会保存请求的上下文信息,这个对象就是Htt ...
- andengine游戏引擎总结基础篇
其他的游戏引擎知道的不是很对,不过相对于学java的童鞋们来说,那是个不错的选择啦,这个发动机咋样,google去吧.基础篇包括图片,字体,音效,数据读取,会了这点,就会做简单的小游戏啦 对于游戏 ...
- Android项目 手机安全卫士(代码最全,注释最详细)之十二 设置中心的界面
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...
- Sublime 学习记录(五) Sublime 其他插件(个人喜好)
(一) JSFormat 安装 :命令面板 pci 回车 JSFormat 回车 功能 : javascript的代码格式化插件 简介 : 很多网站的JS代码都进行了压缩,一行式的甚至混淆压缩,这让 ...
- UVA 11491 Erasing and Winning
题意: 给你一个n位整数,让你删掉d个数字,剩下的数字要尽量大. 分析: 用了vector数组模拟.如果当前要插入的数>vector数组里的最后一位数,就替换且d-- 代码: #include ...
- 从一个小例子认识SQL游标
1 什么是游标: 关系数据库中的操作会对整个行集起作用. 例如,由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行. 这种由语句返回的完整行集称为结果集. 应用程序 ...
- c# 集合的交集、并集、差集
, , , , }; , , , , , }; var jiaoJi = oldArray.Intersect(newArray).ToList();//2,4,5 var oldChaJi = ol ...
- 新炬学院OCM讲师《Oracle核心技术》译作面世
对于数据库爱好者来讲,Oracle是最值得研究的数据库.学习Oracle数据库时,一本好书的引导和启发是非常必要的,毫无疑问,<Oracle核心技术>就是这样一本好书. <Oracl ...
- S5700交换机配置端口镜像
S5700交换机配置端口镜像 <Quidway>system-view //进入系统视图 Enter system view, return user view with Ctrl+ ...
- 使用CRT定位内存泄漏
1. 使能内存泄漏检测#define _CRTDBG_MAP_ALLOC#include <stdlib.h>#include <crtdbg.h>注1:语句顺序不能修改:注2 ...