`
womendu
  • 浏览: 1474797 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

普通表转换为分区表

 
阅读更多
需求描述:
一个表已经上线,但是上线之后发现该表的数据量很大,而且会删除历史数据,该表上要建立多个唯一索引,现在的问题就是在建表的时候是建立了一个普通表,现在需要将普通表转化为分区表,并尽量减少对应用的影响
1、使用ctas的方式来建立
create table t1
(
ID VARCHAR2(60) not null,
a VARCHAR2(60) not null,
b VARCHAR2(60) not null,
create_time TIMESTAMP(6) not null,
d NUMBER(2) not null,
e VARCHAR2(400) not null,
OUTER_ID VARCHAR2(100)
)----原表


---建立分区表:
create table t1_new
(
ID_1 ,
a ,
b ,
create_time ,
d ,
e ,
OUTER_ID
)partition by range (ID_1)
(
partition p_t1_new values less than ('201204'),
partition p_t2_new values less than ('201205'))
as
select * from t1;----此时应用还是不断的往t1表中插入数据-


alter table t1_new add constraints pk_t1_new primary key (id) using tablespace local index_tablespace;----建立本地索引为了删除历史数据
/alter table t1_new add constraints pk_t1_new primary key (id_1) using index local ;


但是应用还在outer_id上建立唯一索引
create unique index IDX_t1_new_2 on t1_new (OUTER_ID) LOCAL ;
此时报


ORA-14039: 分区列必须构成 UNIQUE 索引的关键字列子集
原来oracle不支持在分区表上创建PK主键时主键列不包含分区列,创建另外的约束(unique)也不可以。
为了解决这个问题,两种方法
1、将分区键加到唯一索引里面
2、将local索引变为global索引----此时当进行历史数据删除的时候会导致索引失效
权衡之后在outer_id上建立普通索引




alter table t1 rename to t1_bak;
alter table t1_new rename to t1;
在进行ctas之后需要进行数据完整新检查,而且在进行rename的时候会导致应用连接失效(也有可能在进行alter的时候获取不到表锁而失败)---适用于修改不很频繁的表


2、使用交换分区的方式
----原表
create table t1
(
ID VARCHAR2(60) not null,
a VARCHAR2(60) not null,
b VARCHAR2(60) not null,
create_time TIMESTAMP(6) not null,
d NUMBER(2) not null,
e VARCHAR2(400) not null,
OUTER_ID VARCHAR2(100)
)
alter table t1 add constraints pk_t1 primary key(id) ;


新表
create table t1_new
(
ID_1 ,
a ,
b ,
create_time ,
d ,
e ,
OUTER_ID
)partition by range (ID_1)
(
partition p_t1_new values less than ('201204'),
partition p_t2_new values less than ('201205'))
alter table t1_new add constraints pk_t1_new primary key (id_1) using index local ;


ALTER TABLE t1_new EXCHANGE PARTITION p_t1_new WITH TABLE t1 without validation;----要不要加上without validation(加上的话就是不验证数据是否有效,直接全部放在p_t1_new分区中)
然后进行rename操作


优点:只是对数据字典中分区和表的定义进行了修改,没有数据的修改或复制,效率最高。如果对数据在分区中的分布没有进一步要求的话,实现比较简单。在执行完RENAME操作后,可以检查T_OLD中是否存在数据,如果存在的话,直接将这些数据插入到T中,可以保证对T插入的操作不会丢失。
不足:仍然存在一致性问题,交换分区之后RENAME T_NEW TO T之前,查询、更新和删除会出现错误或访问不到数据。如果要求数据分布到多个分区中,则需要进行分区的SPLIT操作,会增加操作的复杂度,效率也会降低。
适用于包含大数据量的表转到分区表中的一个分区的操作。应尽量在闲时进行操作。


3、在线重定义
----原表
create table t1
(
ID VARCHAR2(60) not null,
a VARCHAR2(60) not null,
b VARCHAR2(60) not null,
create_time TIMESTAMP(6) not null,
d NUMBER(2) not null,
e VARCHAR2(400) not null,
OUTER_ID VARCHAR2(100)
)
alter table t1 add constraints pk_t1 primary key(id) ;


新表
create table t1_new
(
ID_1 ,
a ,
b ,
create_time ,
d ,
e ,
OUTER_ID
)partition by range (ID_1)
(
partition p_t1_new values less than ('201204'),
partition p_t2_new values less than ('201205'))
alter table t1_new add constraints pk_t1_new primary key (id_1) using index local ;


EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T1', DBMS_REDEFINITION.CONS_USE_PK);

EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T1', 'T1_NEW',DBMS_REDEFINITION.CONS_USE_PK);

分享到:
评论

相关推荐

    BLOG_如何将一个普通表转换为分区表.pdf

    BLOG_如何将一个普通表转换为分区表.pdfBLOG_如何将一个普通表转换为分区表.pdf

    oracle普通表转化为分区表的方法

    主要介绍了oracle普通表转化为分区表的方法,官方给出了四种操作方法,本文主要对第四种方法进行详细分析,需要的朋友可以参考下。

    SQL2008分区表的建立

    SQL2008分区操作详解 1.分区表介绍 2.创建分区表 3.操作分区表 4.将普通表转换为分区表. 5.分区表建立

    Oracle堆表转换成分区表方案

    Oracle堆表转换成分区表方案 区别在建中间表时建立普通表即可

    Oracle 分区索引介绍和实例演示

    随着数据量的不断增长,普通的堆表需要转换到分区表,其索引呢,则对应的转换到分区索引。分区索引的好处是显而易见的。就是简单地把一个索引分成多个片断,在获取所需数据时,只需要访问更小的索引片断(块)即可实现...

    Oracle中如何对超大规模数据(如超过2亿条)直接用SQL语句入库?

    在实际生产环境下,有时需将超大规模数据(如超过2亿条)导入分区表,但因原表与目的分区表的字段不一致,且用Kettle等转换工具极易失败,而用insert into select t1,t2.. from tab的Oracle SQL方式直接执行将导致...

    transferdb:Transferdb支持异步数据库模式转换,全量数据导入,导入和增量数据同步功能(Oracle数据库-> MySQL数据库)

    考虑到Oracle分区表特殊且MySQL数据库复杂分区可能不支持,分区表统一认为普通表转换,但是reverse阶段日志中会打印警告【分区表】,若有要求,建议反向之后检查,需手工转换 支持自定义配置表分段类型规则转换(表-...

    安易数据库

    Shift+Delete键直接删除的文件和目录、快速格式化/完全格式化的分区、分区表损坏、盘符无法正常打开的RAW分区数据、在磁盘管理中删除掉的分区、被重新分区过的硬盘数据、一键Ghost对硬盘进行分区、被第三方软件做...

    安易硬盘数据恢复软件

    能够恢复经过回收站删除掉的文件、被Shift+Delete键直接删除的文件和目录、快速格式化/完全格式化的分区、分区表损坏、盘符无法正常打开的RAW分区数据、在磁盘管理中删除掉的分区、被重新分区过的硬盘数据、一键...

    安易硬盘数据恢复软件 v6.68

    能够恢复经过回收站删除掉的文件、被Shift+Delete键直接删除的文件和目录、快速格式化/完全格式化的分区、分区表损坏、盘符无法正常打开的RAW分区数据、在磁盘管理中删除掉的分区、被重新分区过的硬盘数据、一键...

    安易数据恢复软件2.3

    能够恢复经过回收站删除掉的文件、被Shift+Delete键直接删除的文件和目录、快速格式化/完全格式化的分区、分区表损坏、盘符无法正常打开的RAW分区数据、在磁盘管理中删除掉的分区、被重新分区过的硬盘数据、一键...

    EXCEL集成工具箱V6.0

    【将选区转换成图片】 将工作表中的当前选中区域另存为图片。 【一键导出图形】 将工作表中的图片导出为图片文件。 【导入图片到工作表】 将磁盘中的图片导入到工作表中。 【删除选中区域图形】 将工作表中当前...

    EXCEL集成工具箱V8.0完整增强版(精简)

    【将选区转换成图片】 将工作表中的当前选中区域另存为图片。 【一键导出图形】 将工作表中的图片导出为图片文件。 【导入图片到工作表】 将磁盘中的图片导入到工作表中。 【删除选中区域图形】 将工作表中当前...

    Oracle数据库恢复工具Oracle Database Unloader(ODU)3.09

    ODU全称为Oracle Database Unloader,是类似于Oracle的DUL的软件,用于直接从Oracle数据库的数据文件中获取表数据。在各种原因造成的数据库不能打开时,用于抢救数据,最大限度地减少数据丢失。 ODU有什么功能特点...

    安易硬盘数据恢复软件(全能文件恢复软件) v9.73

    能够恢复经过回收站删除掉的文件、被Shift+Delete键直接删除的文件和目录、快速格式化/完全格式化的分区、分区表损坏、盘符无法正常打开的RAW分区数据、在磁盘管理中删除掉的分区、被重新分区过的硬盘数据、一键...

    oracle数据库修复

    支持各种表,包括普通的HEAP表,IOT表和聚簇(CLUSTER)表 支持IOT表: 支持普通IOT表的导出 支持压缩IOT表的导出 支持IOT表溢出段 支持IOT表分区(包括子分区) 只能在有SYSTEM表空间时才能导出IOT表 支持...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。 常见的数据模型 1. 层次结构模型: 层次结构模型实质上是一种有根结点的定向有序树,IMS...

    计算机应用技术(实用手册)

    SECURITY OPTION(检测密码方式)如设定为SETUP,则每次打开机器时屏幕均会提示输入口令(普通用户口令或超级用户口令,普通用户无权修改BIOS设置),不知道口令则无法使用机器;如设定为SYSTEM则只有在用户想进入BIOS设置...

    赤兔Oracle数据库恢复软件 v11.6.zip

    12.能够恢复Oracle 11g及以上版本的SecureFile LOB(目前不支持压缩、去重和加密的SecureFile LOB)支持各种表,包括普通的HEAP表,IOT表和聚簇(CLUSTER)表 13.支持IOT表: 14.支持普通IOT表的导出 15.支持压缩...

Global site tag (gtag.js) - Google Analytics