http://www.orafaq.com/node/1936
"dbms_redefinition"
"dbms_redefinition"
SQL> create table TABLE1 ( 2 no number, 3 name varchar2(20) default 'NONE', 4 ddate date default SYSDATE); Table created. SQL> alter table table1 add constraint pk_no primary key(no); Table altered. SQL> begin 2 for x in 1..100000 loop 3 insert into table1 ( no , name, ddate) 4 values ( x , default, default); 5 end loop; 6 end; 7 / PL/SQL procedure successfully completed. SQL> create or replace trigger tri_table1 2 after insert on table1 3 begin 4 null; 5 end; 6 / Trigger created. SQL> select count(*) from table1; COUNT(*) ---------- 100000 SQL> delete table1 where rownum <= 50000; 50000 rows deleted. SQL> commit; Commit complete. SQL> exec dbms_stats.gather_table_stats('SCOTT','TABLE1'); PL/SQL procedure successfully completed. SQL> select table_name, round((blocks*8),2)||'kb' "size" 2 from user_tables 3 where table_name = 'TABLE1'; TABLE_NAME size ------------------------------ ------------------------------------------ TABLE1 2960kb SQL> select table_name, round((num_rows*avg_row_len/1024),2)||'kb' "size" 2 from user_tables 3 where table_name = 'TABLE1'; TABLE_NAME size ------------------------------ ------------------------------------------ TABLE1 822.69kb SQL> --Minimum Privs required "DBA" role or "SELECT" on dbms_redefinition pkg SQL> --First check table is condidate for redefinition. SQL> SQL> exec sys.dbms_redefinition.can_redef_table('SCOTT',- > 'TABLE1',- > sys.dbms_redefinition.cons_use_pk); PL/SQL procedure successfully completed. SQL> --After verifying that the table can be redefined online, you manually crea te an empty interim table (in the same schema as the table to be redefined) SQL> SQL> create table TABLE2 as select * from table1 WHERE 1 = 2; Table created. SQL> exec sys.dbms_redefinition.start_redef_table ( 'SCOTT',- > 'TABLE1',- > 'TABLE2'); PL/SQL procedure successfully completed. SQL> --This procedure keeps the interim table synchronized with the original tab le. SQL> SQL> exec sys.dbms_redefinition.sync_interim_table ('SCOTT',- > 'TABLE1',- > 'TABLE2'); PL/SQL procedure successfully completed. SQL> --Create PRIMARY KEY on interim table(TABLE2) SQL> alter table TABLE2 2 add constraint pk_no1 primary key (no); Table altered. SQL> create trigger tri_table2 2 after insert on table2 3 begin 4 null; 5 end; 6 / Trigger created. SQL> --Disable foreign key on original table if exists before finish this proces s. SQL> SQL> exec sys.dbms_redefinition.finish_redef_table ( 'SCOTT',- > 'TABLE1',- > 'TABLE2'); PL/SQL procedure successfully completed. SQL> exec dbms_stats.gather_table_stats('SCOTT','TABLE1'); PL/SQL procedure successfully completed. SQL> select table_name, round((blocks*8),2)||'kb' "size" 2 from user_tables 3 where table_name = 'TABLE1'; TABLE_NAME size ------------------------------ ------------------------------------------ TABLE1 1376kb SQL> select table_name, round((num_rows*avg_row_len/1024),2)||'kb' "size" 2 from user_tables 3 where table_name = 'TABLE1'; TABLE_NAME size ------------------------------ ------------------------------------------ TABLE1 841.4kb SQL> select status,constraint_name 2 from user_constraints 3 where table_name = 'TABLE1'; STATUS CONSTRAINT_NAME -------- ------------------------------ ENABLED PK_NO1 SQL> select status ,trigger_name 2 from user_triggers 3 where table_name = 'TABLE1'; STATUS TRIGGER_NAME -------- ------------------------------ ENABLED TRI_TABLE2 SQL> drop table TABLE2 PURGE; Table dropped.
No comments:
Post a Comment