今天因为要对一套数据库的数据抽取进行io优化,希望通过修改表结构将抽取io降下来,因为抽取只针对标签HAVE_FLAG为“0”的值进行抽取,抽取之后更新HAVE_FLAG为其他值,所以计划将HAVE_FLAG在时间分区里面再按照“0”和其他值进行list分区,控制SQL扫描的范围,再配合索引,降低IO。

准备工作

提取表和索引的语句。

SELECT DBMS_METADATA.GET_DDL(OBJECT_TYPE => 'TABLE', NAME => 'CONTACT_CLSLIST') ||  DBMS_METADATA.GET_DEPENDENT_DDL(OBJECT_TYPE => 'INDEX',  BASE_OBJECT_NAME => 'CONTACT_CLSLIST') FROM DUAL ;

根据生产表的结构修改中间表

CREATE TABLE "INCRCBPS8"."CONTACT_CLSLIST_TEST"
( "CUST_ID" NUMBER(38,0),
"CONTACT_SEQ" NUMBER(38,0),
"CONTACT_CLASS_SEQ" NUMBER(38,0),
"CONTACT_CLASS_CODE" CHAR(1),
"CONTACT_NO" VARCHAR2(680),
"CONTACT_EXT" VARCHAR2(680),
"FROM_BRANCH" VARCHAR2(30),
"TRANS_ID" VARCHAR2(60),
"COMMIT_TIMESTAMP" VARCHAR2(20),
"COMMIT_CSN" NUMBER,
"OP_SEQ" NUMBER,
"LAST_OP_FLAG" VARCHAR2(20),
"LAST_TIME" DATE DEFAULT SYSDATE,
"HAVE_FLAG" VARCHAR2(50) DEFAULT '0',
"HAVE_FLAG_1" VARCHAR2(50) DEFAULT '0',
"HAVE_FLAG_2" VARCHAR2(50) DEFAULT '0',
"HAVE_FLAG_3" VARCHAR2(50) DEFAULT '0',
"HAVE_FLAG_4" VARCHAR2(50) DEFAULT '0'
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOLOGGING
STORAGE(
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "CMDS"
PARTITION BY RANGE ("LAST_TIME") INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
SUBPARTITION BY LIST ("HAVE_FLAG")
SUBPARTITION TEMPLATE (
SUBPARTITION "SUBP0" VALUES ( '0' ),
SUBPARTITION "SUBOTHER" VALUES ( default ) )
(PARTITION "P1" VALUES LESS THAN (TO_DATE(' 2015-01-01 00:00:00', 'SYYYY-MM-DD
HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "CMDS" NOLOGGING )

中间表创建完毕之后,创建相关索引

将步骤1的SQL中的表名CONTACT_CLSLIST替换为CONTACT_CLSLIST_TEST创建中间表

中间表新增字段remark01

alter table CONTACT_CLSLIST_TEST add remark01 varchar2(10) default 'A';

检查能否进行重定义,过程执行成功即说明可以重定义,因为测试表没有主键,所以要写上用rowid,如果有主键,就是CONS_USE_PK

begin
DBMS_REDEFINITION.CAN_REDEF_TABLE('cmds','CONTACT_CLSLIST',DBMS_REDEFINITION.CONS_USE_ROWID);
end;
/

如果有主键,就是CONS_USE_PK

begin
DBMS_REDEFINITION.CAN_REDEF_TABLE('cmds','CONTACT_CLSLIST',DBMS_REDEFINITION.CONS_USE_PK);
end;
/

开始重定义表

运行start_redef_table过程

BEGIN
dbms_redefinition.start_redef_table(uname => CMDS,orig_table => 'CONTACT_CLSLIST', int_table => 'CONTACT_CLSLIST_TEST', options_flag => DBMS_REDEFINITION.cons_use_rowid);
END;
/

开始同步中间表

BEGIN
dbms_redefinition.sync_interim_table(uname => 'CMDS',orig_table => 'CONTACT_CLSLIST',int_table => 'CONTACT_CLSLIST_TEST');
END;
/

完成同步

BEGIN
dbms_redefinition.finish_redef_table(uname => 'CMDS',orig_table => 'CONTACT_CLSLIST',int_table => 'CONTACT_CLSLIST_TEST');
END;
/

删除中间表

drop table CONTACT_CLSLIST_TEST;

修改索引名称

alter index "IDX_CONTACT_CLSLIST_NO_mid" rename to IDX_CONTACT_CLSLIST_NO;
alter index "IDX_CONTACT_CLSLIST_INDEX_mid" rename to IDX_CONTACT_CLSLIST_INDEX;

执行完以上的9个步骤,新增字段就创建成功了。

oracle 11g 通过在线重定义方式修改表结构的更多相关文章

  1. 通过替换frm文件方式修改表结构

    版本:5.6.16 在自己的虚拟环境中,测试创建一个表,表结构如下:mysql> drop table yoon_temp;Query OK, 0 rows affected (0.09 sec ...

  2. oracle普通表转分区表(在线重定义方式)

    1.1.TAB_TAOBAO_BILL 1.1.1检查下这张表是否可以在线重定义,无报错表示可以,报错会给出错误信息: exec dbms_redefinition.can_redef_table(' ...

  3. Oracle在线重定义DBMS_REDEFINITION 普通表—>分区表

    实验环境:RHEL 6.4 + Oracle 11.2.0.3实验:在线重定义 普通表 为 分区表,包括主键对应的索引都改造为分区索引. 1,构造普通表t_objects conn test1/tes ...

  4. Oracle 关于定义约束 / 修改表结构 /修改约束

    ---约束分5种:主键 外键 唯一 非空 检查5类约束 Oracle中分列级别约束 与 表级别约束 列级别约束:在创建表时再列上面加约束 例如: create table table11( stuno ...

  5. oracle 11g 将非分区表转换为分区表在线重定义

    --操作的用户需要有以下的权限 GRANT CONNECT, RESOURCE TO CMIGDW; GRANT EXECUTE ON DBMS_REDEFINITION TO CMIGDW; GRA ...

  6. oracle在线重定义表

    在一个高可用系统中,如果需要改变一个表的定义是一件比较棘手的问题,尤其是对于7×24系统.Oracle提供的基本语法基本可以满足一般性修改,但是对于把普通堆表改为分区表,把索引组织表修改为堆表等操作就 ...

  7. (Oracle)已有数据表建立表分区—在线重定义

    今天在做数据抽取的时候,发现有一张业务表数据量达到了5000W,所以就想将此表改为分区表.分区表的有点如下: 1.改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度.2.增强可用性: ...

  8. Oracle在线重定义(online redefinition)--将普通表改为分区表

    使用Oracle的在线重定义技术,可以将Oracle的普通表改为分区表.操作如下: STEP1:测试表是否可以在线重定义,这里以unixdev数据库的LIJIAMAN.BSTEST为例 EXEC DB ...

  9. Oracle 在线重定义表分区

    ==================原始表================原始表=====================原始表 create table BUILDING_temp(building ...

随机推荐

  1. jdbc 各驱动写法

    1.Oracle8/8i/9i数据库(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); ...

  2. bootstrap的图标无法正常显示解决方法

    bootstrap的图标无法在火狐浏览器上正常显示,出现的是乱码,如下图所示: 解决方案: 直接把bootstrap整个文件夹放到项目中,引用的时候../static/bootstrap-3.3.5- ...

  3. NOIP201103瑞士轮【B002】

    [B002]瑞士轮[B级]出自附中OJ————————————————————————————————————————————————————————————————————————————————— ...

  4. 用super daemon xinetd进行安全配置

    xinetd 可以进行安全性或者是其他的管理机制的控制,这些控制手段都可以让我们的服务更为安全,资源管理更为合理.一些对客户端开放较多权限的服务(例如telnet)或者本身不带有管理机制的服务就可以通 ...

  5. 2014-2015 ACM-ICPC, NEERC, Moscow Subregional Contest E. Equal Digits

    E. Equal Digits time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  6. ural 1342. Enterprise

    1342. Enterprise Time limit: 5.0 secondMemory limit: 64 MB To bind a broom it’s a hard work. As ther ...

  7. 自定义UICollectionViewLayout之瀑布流

    目标效果 因为系统给我们提供的 UICollectionViewFlowLayout 布局类不能实现瀑布流的效果,如果我们想实现 瀑布流 的效果,需要自定义一个 UICollectionViewLay ...

  8. Word2Vec源码解析

    Reference:http://blog.csdn.net/itplus/article/details/37969519  (Word2Vec解析(部分有错)) 源码:http://pan.bai ...

  9. ubifs核心功能 -- 垃圾回收

    可回收空间的分类 垃圾回收的目的是再利用(回收后的空间大小能写入有效的node),如果再利用的价值越低,其回收的必要性越低.为了进行有效的垃圾回收,UBIFS对可回收空间做了2个层次的水线划分: 死空 ...

  10. 【BZOJ】2675: Bomb

    题意: 给n个点,任选其中3个点(一个点只能取一次),求选出三个点的最大曼哈顿距离之和与最小曼哈顿距离之和(n<=10^5). 题解: 最大曼哈顿距离之和很好求,就是能包围所有点的经过三个点的矩 ...