ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle 碎片整理

oracle 碎片整理

原创 Linux操作系统 作者:aishu521 时间:2012-06-27 17:04:34 0 删除 编辑
-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博客 ” ,链接:http://blog.itpub.net/15187685/viewspace-733959/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 索引重建
请登录后发表评论 登录
全部评论

注册时间:2012-05-26

  • 博文量
    139
  • 访问量
    684740