`
mikixiyou
  • 浏览: 1086556 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:349477
社区版块
存档分类
最新评论

Oracle分区表的分区交互技术实现数据快速转移

阅读更多

有一个需求,将某业务表的某个时间点之前的记录转移到它的历史表中。如果当前业务表不是基于这个业务时间点的分区表设置,那只能insert再delete操作。这种转移数据的方法非常非常低基础。经常在初级的数据库管理人员和开发人员的程序中出现。不是说这个方法不好,对于转移的记录数量在几十几百条,而转移频率高,转移时间点随机的情况而言,这个方法还是挺管用的。但如果转移的数据量一次数以百万计的话,这种方法就显得低效了。
因此,在Oracle数据库开发中,对于这种大数据的转移可以使用分区表交换技术实现。即使你一次转移的数据量几亿甚至几十亿也没有关系,转移时间依然是毫秒级的。这个方法大体流程是这样:
首先,你需要将当前表修改为分区表,找到分区字段很关键;其次,这个分区表的索引都建立成本地索引,全局索引就不要了,原因后面介绍;再次,建立一个对应的临时非分区表,表结构和这个一样;最后使用alter table table_name exchange partition  Partition_name with table table_name_exchange;操作,将表分区所拥有数据的实际物理存储空间段相互交换,这是指针级的操作。
这样就完成了这个表分区数据的快速转移。

就这个操作流程,做一个测试。

 

(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1773659)

第一步,准备环境

建立一张测试表SALE,它的分区字段是DOTIME,按照季度进行分区。

CREATE TABLE SALE
(
  DOTIME          DATE                          DEFAULT sysdate,
  BILLID          VARCHAR2(20 BYTE)             NOT NULL,
  FROMARREAR      NUMBER(16,4)                  DEFAULT 0
)
PARTITION BY RANGE (DOTIME)
( 
  PARTITION PY11Q3 VALUES LESS THAN (TO_DATE(' 2011-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    LOGGING, 
  PARTITION PY11Q4 VALUES LESS THAN (TO_DATE(' 2012-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    LOGGING, 
  PARTITION PY12Q1 VALUES LESS THAN (TO_DATE(' 2012-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    LOGGING, 
  PARTITION PY12Q2 VALUES LESS THAN (TO_DATE(' 2012-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    LOGGING, 
  PARTITION P_MAX VALUES LESS THAN (MAXVALUE)
    LOGGING
)
;

 

再建立一张交换表,表的字段结构和分区表完全一致。

create table SALE_exchange
(
  DOTIME          DATE                          DEFAULT sysdate,
  BILLID          VARCHAR2(20 BYTE)             NOT NULL,
  FROMARREAR      NUMBER(16,4)                  DEFAULT 0
);

 

注意,分区表上的主键所属的全局唯一索引不要了,改成SALE (BILLID,DOTIME)上的本地索引,这样也能保证数据的一致性。原来的主键字段billid必须放在前面,防止原来原来基于billid直接查询操作的性能下降太多。

create unique index PK_SALE on SALE (BILLID,DOTIME) local;

本地分区索引创建完毕。


第二步,
检查一下数据记录情况。假设我们要将PY11Q3分区中的记录转移走。
select count(*) from SALE partition(PY11Q3);
select  count(*)  from SALE_exchange;

第三步,转移数据

alter table SALE exchange partition  PY11Q3 with table SALE_exchange;

一个命令,将分区段和表段的空间指针互相替换,就实现了这个分区表的业务数据的转移工作。

第四步,检查索引状态

分区表这点不好,如果分区发生改变,如exchange,move,split等,那么该分区上的本地索引分区就会失效,同时整个分区表上的全局索引也会失效。所以我最开始说全局索引需要撤销了,就是这个道理。试想,如果这时还有全局索引存在,那它失效了,这就将影响到分区表的其他业务操作。

不管怎样,都需要检查一下索引状态。

select index_name, partition_name, status
  from user_ind_partitions
 where status = 'UNUSABLE'
union all
select index_name, '' as partition_name, status
  from user_indexes
 where status = 'UNUSABLE';

 

这里,本地分区索引的索引分区肯定失效了。原来exchange表上的索引也会失效。它们都需要重建。
分区索引的重建:
alter index PK_SALE rebuild partition PY11Q3;
 
alter index PK_SALE_EXCHANGE rebuild;


经过这样的操作之后,历史数据是从当前业务表移出来了,但它在一个临时的孤立的表中。在现实业务中,这样的数据是需要移动历史表中。当然,如果你有转换操作,你可以继续使用insert 方法转移。如果没有,你还可以使用分区交换技术,将这个数据交换到历史表中。

简而言之,Oracle分区表技术在大数据量表的操作中建议经常使用,它的很多特性有助于我们开发出高效的应用程序。

1
0
分享到:
评论
2 楼 mikixiyou 2013-07-12  
zhangyuslam 写道
如果担心全局索引失效,可以使用如下语句吧:
alter index PK_SALE rebuild partition PY11Q3 update global indexes


rebuild过程接受不了,大量的锁等待。。。
1 楼 zhangyuslam 2013-07-03  
如果担心全局索引失效,可以使用如下语句吧:
alter index PK_SALE rebuild partition PY11Q3 update global indexes

相关推荐

    Oracle自学(学习)材料 (共18章 偏理论一点)

    11 管理表 目标 11-2 储存用户数据 11-3 Oracle 数据类型 11-5 ROWID 格式 11-8 行的结构 11-10 创建一张表 11-11 创建临时表 11-13 创建表:指南 11-14 修改储存参数 11-15 手工分配片 11-16 重构非分区表 11-17 ...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    有近20年使用Oracle技术产品以及Oracle数据库管理员/Oracle数据库应用管理员的经验,是真正应用集群、性能调优以及数据库内部属性方面的专家。同时是一位演讲家及Oracle ACE。  JARED STILL 从1994年就开始使用...

    ORACLE9i_优化设计与系统调整

    §1.1.1 Oracle数据字典 23 §1.1.2 表空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1 数据文件 26 §1.2.2 控制文件 26 §1.2.3 重做日志文件 26 §1.2.4 其它支持文件 26 §...

    oracle数据库dba管理手册

    1.4.1 表、列和数据类型 4 1.4.2 约束条件 5 1.4.3 抽象数据类型 6 1.4.4 分区和子分区 7 1.4.5 用户 7 1.4.6 模式 8 1.4.7 索引 8 1.4.8 簇 9 1.4.9 散列簇 9 1.4.10 视图 9 1.4.11 序列 10 1.4.12 过程 10 1.4.13 ...

    数据库系统-招标参数---模板.doc

    " " "数据库性能 "数据库提供数据表分区能力的商务和技术许可,以" " " "便支持海量数据表的需求。 " " " "具有支持并行操作所需的技术,如并行装载,并行" " " "查询,并行创建索引等 " " " "提供分区索引视图功能 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例070 网页版九九乘法表 104 实例071 读取数组购物车中的数据 105 实例072 图像验证码的生成 106 2.6 跳转语句 107 实例073 控制页面中表情图的输出 107 实例074 控制页面中数据的输出数量 108 实例075 动态改变...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例070 网页版九九乘法表 104 实例071 读取数组购物车中的数据 105 实例072 图像验证码的生成 106 2.6 跳转语句 107 实例073 控制页面中表情图的输出 107 实例074 控制页面中数据的输出数量 108 实例075 动态改变...

    网管教程 从入门到精通软件篇.txt

    如果系统检测到无效或非标准分区表标记,将提示用户是否继续执行该命令。除非您访问驱动器有问题,否则不要继续进行。向系统分区写入新的主引导记录可能破坏分区表并导致分区无法访问。  format  将指定的驱动器...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    例如数据表中用户选择字段方式的改变,用户查询的需求也会不断的更新和完善。所有这些,都要求系统提供足够的手段进行功能的调整和扩充。而要实现这一点,应通过系统的开放性来完成,既系统应是一个开放系统,只要...

    JAVA上百实例源码以及开源项目源代码

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...

    Baze-de-Date-Relationale:study我的研究数据库工作区

    关系数据库 :oil_drum: I. SQL(Oracle)-结构化查询语言 A.数据库架构B. LDD命令-数据定义语言C....通过SQL命令与Oracle服务器交互4.基本计划结构5.复合数据类型6.游标7.处理异常8.子程序9.子程序包10.触发数据库

    JAVA上百实例源码以及开源项目

    百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText();...

    收获不止SQL优化

    7.3.1 分区表相关案例 185 7.3.2 全局临时表案例 190 7.3.3 监控异常的表设计 195 7.3.4 表设计优化相关案例总结 199 7.4 本章习题、总结与延伸 199 第8章 且慢,学习索引如何让SQL飞 200 8.1 索引知识要点...

Global site tag (gtag.js) - Google Analytics