-Constants for the options_flag parameter ofstart_redef_table
cons_use_pk CONSTANT PLS_INTEGER := 1;---主键重定义
cons_use_rowid CONSTANT PLS_INTEGER :=2;---rowid重定义
config:源表barcode13数据量考虑,需要转换为分区表;
1,測試
SQL> exec dbms_redefinition.can_redef_table('sfcdata','barcode13');
PL/SQL procedure successfully completed.
2
建中建表
create table SFCDATA.BARCODE13_test
(
TOOLSNUM VARCHAR2(10) not null,
YEAR_CODE VARCHAR2(2) not null,
WEEK_CODE VARCHAR2(2) not null,
PLANT_CODE VARCHAR2(3) not null,
SERIALNUM VARCHAR2(4) not null,
ENGINEER_CODE VARCHAR2(3) not null,
REVISION VARCHAR2(1) not null,
CREATEDATE VARCHAR2(8),
CREATETIME VARCHAR2(6),
CREATER VARCHAR2(10),
WORKNO VARCHAR2(20),
BARCODE VARCHAR2(30)
)
partition by range(CREATEDATE)
( PARTITION P20110501 VALUES LESS THAN ('20110501'),
PARTITION P20110901 VALUES LESS THAN('20110901'),
PARTITION P20111201 VALUES LESS THAN('20111201'),
PARTITION P20120201 VALUES LESS THAN('20120201'),
PARTITION P20120401 VALUES LESS THAN('20120401'),
PARTITION P20120501 VALUES LESS THAN('20120501')
);
3,步骤三、开始进行重定义
數據量select count(*) from sfcdata.barcode13
3689834
execute dbms_redefinition.start_redef_table('sfcdata','BARCODE13','BARCODE13_test',null,2);---
SQL> select count(*) from sfcdata.barcode13;
COUNT(*)
----------
3689834
SQL> select count(*) from sfcdata.barcode13_test;
COUNT(*)
----------
3689834
并且对表进行DML操作
delete sfcdata.barcode13 where barcode='1N1270DGY870D'
步骤四、保证数据的一致性:
execute dbms_redefinition.sync_interim_table('sfcdata','BARCODE13','BARCODE13_test');
步骤五、开始重定义之后,完成重定义之前,需要在中间表上创建与源表对应的索引、外键、触发器等,而中间表与源表对应的主键,如果需要按照主键重定义,需要再开始redefine之前创建,如果按照rowid进行重定义,对应主键呢?
alter table SFCDATA.BARCODE13_test
add constraint PK_BARCODE13_test primary key (YEAR_CODE, TOOLSNUM, WEEK_CODE, SERIALNUM)
using index
tablespace TBS_SFCDATA
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 2M
next 2M
minextents 1
maxextents unlimited
pctincrease 0
);
-- Create/Recreate indexes
create index SFCDATA.BARCODE13_testA on SFCDATA.BARCODE13_test (BARCODE, WORKNO)
tablespace TBS_SFCDATA
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 2M
next 2M
minextents 1
maxextents unlimited
pctincrease 0
);
步骤六、完成重定义
----完成重定义
SQL> execute dbms_redefinition.finish_redef_table('sfcdata','BARCODE13','BARCODE13_test');
PL/SQL procedure successfully completed.
desc sfcdata.BARCODE13
/
select table_name,index_name,index_type,status
from user_indexes
where table_name in ('BARCODE13','BARCODE13_TEST');
此时的'BARCODE13的索引为SFCDATA.BARCODE13_testA
而非原来SFCDATA.BARCODE13_test,
BARCODE13_TEST的索引由SFCDATA.BARCODE13_test变成SFCDATA.BARCODE13_testA
表结构变成分区表的结构,而的BARCODE13_test的结构变成了redefine之前的的LOGIN_USER_DETAIL的普通表结构;
对于触发器又会是什么效果呢?
步骤七:
DROP TABLE SFCDATA.BARCODE13_test
步驟八:索引重建
select * from dba_indexes a where a.table_name='BARCODE13'
索引的狀態都是 disable
需要重建
select * from dba_indexes a where a.index_name='PK_BARCODE13'
一,normal索引重建方法
1,複製創建語句
2,刪除索引 drop index indexname
3,把複製索引語句執行下
二,對於unique或者primary key 的刪除處理方法
1, 修改表狀態為disable
ALTER TABLE SFCDATA.BARCODE13
MODIFY PRIMARY KEY DISABLE;
2,刪除索引
drop index SFCDATA.PK_BARCODE13
3,修改表主鍵為enable,主鍵索引自動創建
ALTER TABLE SFCDATA.BARCODE13
MODIFY PRIMARY KEY ENABLE;
以上在表和索引都在同一表空間里
结论:
重定义的方式有2个按照rowid、主键;
重定义的过程中可以对表进行DML操作;
重定义的速度还是挺快的;
重定义需要用户有一定系统权限(不知道是不是合适这么说)、需要一个中间表(中间表的结构、列名可以与be_organized的表不同)、重定义开始到重定义结束需要在中间表上建一系列约束;重定义完成之后的效果是:
be_organized的表结构、约束信息与中间表的互相交换,二者数据量一致。
可以普通表转为分区表;
分区表也可以重定义。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15187685/viewspace-733959/
,如需转载,请注明出处,否则将追究法律责任。