在线重定义原理探讨

SQL> create table t_d as select * from all_objects;
   
Table created
   
SQL> alter table t_d add primary key (object_id);
   
Table altered
   
SQL> create table t_d_t as select * from t_d where 1=0;
   
Table created
   
SQL> alter table t_d_t add primary key (object_id);
   
Table altered
  
SQL> select count (*) from T_D;
   
   COUNT (*)
----------
      48945
   
SQL> select count (*) from T_D_T;
   
   COUNT (*)
----------
      0

2、执行在线同步

SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE( user , 'T_D' , DBMS_REDEFINITION.CONS_USE_PK);
   
PL/SQL procedure successfully completed
   
SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE( USER , 'T_D' , 'T_D_T' );
   
PL/SQL procedure successfully completed

3、查询相关物化视图

SQL> select owner,mview_name from user_mviews;
   
OWNER                          MVIEW_NAME
------------------------------ ------------------------------
CHF                            T_D_T
  
SQL> select log_owner,master,log_table from user_mview_logs;
   
LOG_OWNER                      MASTER                         LOG_TABLE
------------------------------ ------------------------------ ------------------------------
CHF                            T_D                            MLOG$_T_D
  
  
CREATE MATERIALIZED VIEW T_D_T
ON PREBUILT TABLE
REFRESH FAST ON DEMAND
AS
SELECT "T_D" . "OWNER" "OWNER" , "T_D" . "OBJECT_NAME" "OBJECT_NAME" ,
"T_D" . "SUBOBJECT_NAME" "SUBOBJECT_NAME" , "T_D" . "OBJECT_ID" "OBJECT_ID" ,
"T_D" . "DATA_OBJECT_ID" "DATA_OBJECT_ID" , "T_D" . "OBJECT_TYPE" "OBJECT_TYPE" ,
"T_D" . "CREATED" "CREATED" , "T_D" . "LAST_DDL_TIME" "LAST_DDL_TIME" ,
"T_D" . "TIMESTAMP" "TIMESTAMP" , "T_D" . "STATUS" "STATUS" ,
"T_D" . "TEMPORARY" "TEMPORARY" , "T_D" . "GENERATED" "GENERATED" ,
"T_D" . "SECONDARY" "SECONDARY" FROM "CHF" . "T_D" "T_D" ;

4、结束物化视图

SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE( USER , 'T_D' , 'T_D_T' );
   
PL/SQL procedure successfully completed

5、继续查询相关物化视图

SQL>  select log_owner,master,log_table from user_mview_logs;
   
   
SQL> select * from user_mviews;
   
SQL> select owner,mview_name from user_mviews;
   
OWNER                          MVIEW_NAME
------------------------------ ------------------------------
  
SQL> select log_owner,master,log_table from user_mview_logs;
   
LOG_OWNER                      MASTER                         LOG_TABLE
------------------------------ ------------------------------ ------------------------
  
SQL> select count (*) from T_D_T;
   
   COUNT (*)
----------
      48945

6、由试验可以得出
6.1)在线重定义本质就是利用物化视图刷新实现数据迁移
6.2)DBMS_REDEFINITION.START_REDEF_TABLE实现功能:
6.2.1)创建含on prebuilt table的物化视图和物化视图日志
6.2.2)实现通过物化视图刷新当前表中数据进入中间表
6.3)dbms_redefinition.sync_interim_table实现物化视图刷新在执行5.2)操作过程中变化数据
6.4)DBMS_REDEFINITION.FINISH_REDEF_TABLE将锁定原表,防止表上的DML,物化视图执行刷新,完成刷新后,将删除物化视图和对应的日志,将中间表rename成目标表

7、如果表无主键时,区别有
7.1)执行在线定义语句,

7.2)创建物化视图语句上

create materialized view T_D_T
on prebuilt table
refresh fast on demand
with rowid
as
select OWNER OWNER, 
OBJECT_NAME OBJECT_NAME,
  SUBOBJECT_NAME SUBOBJECT_NAME, 
  OBJECT_ID OBJECT_ID, 
  DATA_OBJECT_ID DATA_OBJECT_ID, 
  OBJECT_TYPE OBJECT_TYPE, 
  CREATED CREATED, 
  LAST_DDL_TIME LAST_DDL_TIME, 
  TIMESTAMP TIMESTAMP
  STATUS STATUS, 
  TEMPORARY TEMPORARY
  GENERATED GENERATED, 
  SECONDARY SECONDARY 
  from "CHF" . "T_D"   "T_D" ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值