oracle 碎片整理

aishu521發表於2012-06-27
-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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章