oracle强制走分区,ORACLE 使用在线重定义对非分区表进行分区

在线重定义的大致操作流程:

1、创建基础表A;

2、创建临时分区表B;

3、开始重定义,将基表A的数据导入临时分区表B;

4、结束重定义,数据库将2个表进行了交换。即此时基表A成了分区表,而临时分区表B成了普通表;

此时临时表B已经是普通表,可以删除。

在线重定义能保证数据的一致性,在大部分时间内,表都可以正常进行DML操作。只在切换的瞬间锁表,具有很高的可用性。

--创建基本表和索引,该表名为最终的分区表名

create table  BBGL_BBSJMX_NEW as select * from BBGL_BBSJMX;

-- 26453M

create index BBGL_BBSJMX_new_idx on BBGL_BBSJMX_new(BBSSQS);

commit;

--创建主键

CREATE UNIQUE INDEX BBGL.PK_BBGL_BBSJMX_NEW

ON BBGL.BBGL_BBSJMX_NEW(DWSBH, BB_ID, BBSSQS, BBSSQZ, XH)

--收集表的统计信息

exec dbms_stats.gather_table_stats('BBGL','BBGL_BBSJMX_new',cascade=>true);

--创建临时分区表

CREATE TABLE BBGL_BBSJMX_par  (

DWSBH          VARCHAR2(23) NOT NULL,

BB_ID          VARCHAR2(10) NOT NULL,

BBSSQS         DATE NOT NULL,

BBSSQZ         DATE NOT NULL,

XH             NUMBER(8,0) NOT NULL,

BB_SJZT_DM     VARCHAR2(10) NULL,

FL1            VARCHAR2(250) NULL,

FL2            VARCHAR2(250) NULL,

FL3            VARCHAR2(250) NULL,

FL4            VARCHAR2(250) NULL,

FL5            VARCHAR2(250) NULL,

FL6            VARCHAR2(250) NULL,

FL7            VARCHAR2(250) NULL,

FL8            VARCHAR2(250) NULL,

FL9            VARCHAR2(250) NULL,

FL10           VARCHAR2(250) NULL,

FL11           VARCHAR2(250) NULL,

FL12           VARCHAR2(250) NULL,

FL13           VARCHAR2(250) NULL,

FL14           VARCHAR2(250) NULL,

FL15           VARCHAR2(250) NULL,

FL16           VARCHAR2(250) NULL,

FL17           VARCHAR2(250) NULL,

FL18           VARCHAR2(250) NULL,

FL19           VARCHAR2(250) NULL,

FL20           VARCHAR2(250) NULL,

FL21           VARCHAR2(250) NULL,

FL22           VARCHAR2(250) NULL,

FL23           VARCHAR2(250) NULL,

FL24           VARCHAR2(250) NULL,

FL25           VARCHAR2(250) NULL,

FL26           VARCHAR2(250) NULL,

FL27           VARCHAR2(250) NULL,

FL28           VARCHAR2(250) NULL,

FL29           VARCHAR2(250) NULL,

FL30           VARCHAR2(250) NULL,

IS_FROM_IREPORTVARCHAR2(2) NULL

) partition by range(BBSSQS)

(partition p1 values less than (to_date('2008-1-1', 'yyyy-mm-dd')),

partition p2 values less than (to_date('2012-1-1', 'yyyy-mm-dd')),

partition p3 values less than (to_date('2013-1-1', 'yyyy-mm-dd')),

partition p4 values less than (to_date('2013-7-1', 'yyyy-mm-dd')),

partition p5 values less than (to_date('2014-1-1', 'yyyy-mm-dd')),

partition p6 values less than (to_date('2014-7-1', 'yyyy-mm-dd')),

partition p7 values less than (maxvalue));

--检查重定义的合理性

exec dbms_redefinition.can_redef_table('BBGL', 'BBGL_BBSJMX_new');

--开始重定义:这步执行完后,分区属性还没改变

BEGIN

DBMS_REDEFINITION.start_redef_table(

uname => 'BBGL',

orig_table => 'BBGL_BBSJMX_new',

int_table => 'BBGL_BBSJMX_par');

END;

--如果分区表的列名和原表不一致,那么在开始重定义的时候,需要重新指定映射关系:

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(

'BBGL',

'BBGL_BBSJMX_new',

'BBGL_BBSJMX_par',

'BBID ID, create_date BBSSQS', -- 在这里指定新的映射关系

DBMS_REDEFINITION.CONS_USE_PK);

--同步新表:sync_interim_table的目的是为了缩短finish时锁定表的时间。

BEGIN

DBMS_REDEFINITION.sync_interim_table(

uname => 'BBGL',

orig_table => 'BBGL_BBSJMX_new',

int_table => 'BBGL_BBSJMX_par');

END;

--创建索引,在线重定义只重定义数据,索引还需要单独建立。

create index BBGL_BBSJMX_par_idx on BBGL_BBSJMX_par(BBSSQS);

commit;

--收集表的统计信息

exec dbms_stats.gather_table_stats('BBGL','BBGL_BBSJMX_par',cascade=>true);

--结束重定义

BEGIN

DBMS_REDEFINITION.finish_redef_table(

uname => 'BBGL',

orig_table => 'BBGL_BBSJMX_new',

int_table => 'BBGL_BBSJMX_par');

END;

--结束重定义的意义:

--基表BBGL_BBSJMX_new 和临时分区表BBGL_BBSJMX_par 进行了交换。 此时临时分区表BBGL_BBSJMX_par成了普通表,我们的基表BBGL_BBSJMX_new成了分区表。

--我们在重定义的时候,基表BBGL_BBSJMX_new是可以进行DML操作的。 只有在2个表进行切换的时候会有短暂的锁表。

--删除临时表

DROP TABLE BBGL_BBSJMX_par;

--验证

select partitioned from user_tables where table_name = 'BBGL_BBSJMX_NEW';

select partition_name from user_tab_partitions where table_name = 'BBGL_BBSJMX_NEW';

select count(*) from BBGL_BBSJMX_NEW partition (p7);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值