91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Oracle Online Redefinition在線重定義的示例分析

發布時間:2021-11-06 10:06:01 來源:億速云 閱讀:152 作者:柒染 欄目:建站服務器

這篇文章將為大家詳細講解有關Oracle Online Redefinition在線重定義的示例分析,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

我們從一個較復雜的案例出發,討論復雜變化情況下如何進行Online Redefinition,以及dbms_redefinition包各個關鍵方法的作用。

一個分區表的重定義動作

我們定義一個數據表T。

SQL> create table t as select object_id, object_name, created from dba_objects;

Table created

SQL> desc t;

Name        Type          Nullable Default Comments

----------- ------------- -------- ------- --------

OBJECT_ID   NUMBER        Y                        

OBJECT_NAME VARCHAR2(128) Y                        

CREATED     DATE          Y                        

SQL> alter table t add constraint pk_t primary key (object_id);

Table altered

SQL> select count(*) from t;

  COUNT(*)

----------

     75192

期望的重定義目標有幾個:首先使用object_id進行分區、created字段從date類型變為timestamp類型。另外object_name字段改名為object_name_2。中間定義表如下:

(分區,created變類型,object_name字段改名)

SQL> create table t_interim

  2  (object_id number,

  3   object_name_2 varchar2(128),

  4   created timestamp

  5  )

  6  partition by range(object_id)

  7  (

  8     partition p1 values less than (10000),

  9     partition p2 values less than (50000),

 10     partition p3 values less than (maxvalue)

 11  )

 12  ;

Table created

首先,判斷是否可以進行重定義操作。

SQL> set serveroutput on;

SQL> exec dbms_redefinition.can_redef_table( 'SCOTT','T',options_flag => dbms_redefinition.cons_use_pk);

PL/SQL procedure successfully completed

啟動重定義動作。

SQL> exec dbms_redefinition.start_redef_table('SCOTT','T','T_INTERIM',col_mapping => 'object_id object_id, object_name object_name_2, to_timestamp(created) created',options_flag => dbms_redefinition.cons_use_pk);

PL/SQL procedure successfully completed

SQL> set timing on;

注意這個col_mapping映射關系設置,如果存在列名轉換,就在這里將列關系映射說明出來。如果需要進行字段類型轉換,要書寫函數關系將映射計算規則定義出來。

Oracle在線重定義的基礎是物化視圖技術。此時,我們檢查試圖user_mviews,可以看到有一個新的物化視圖生成,并且存在對應的物化視圖日志。

SQL> col query for a20;

SQL> select mview_name, container_name, query, REFRESH_METHOD from user_mviews;

MVIEW_NAME CONTAINER_NAME       QUERY                REFRESH_METHOD

---------- -------------------- -------------------- --------------

T_INTERIM  T_INTERIM            select object_id obj         FAST

                                ect_id, object_name 

                                object_name_2, to_ti

                                mestamp(created) cre

                                ated from "SCOTT"."T

                                "   "T"             

Executed in 0.031 seconds

SQL> select master, log_table from user_mview_logs;

MASTER                         LOG_TABLE

------------------------------ ------------------------------

T                              MLOG$_T

Executed in 0.016 seconds

Start方法創建了一個Fast刷新模式的物化視圖對象t_interim。物化視圖中最重要的物化視圖日志,名稱為MLOG$_T。

此時,數據表數據情況如下。

--源數據表和中間數據表已經實現同步

SQL> select count(*) from t;

  COUNT(*)

----------

     75192

Executed in 0.016 seconds

SQL> select count(*) from t_interim;

  COUNT(*)

----------

     75192

Executed in 0.031 seconds

--沒有DML語句過程,物化視圖日志尚空

SQL> select count(*) from mlog$_t;

  COUNT(*)

----------

         0

Executed in 0.015 seconds

綜合上述內容,說明start_redef_table的作用是下面幾個方面:

ü  以Interim數據表為名稱,創建一個Fast刷新模式的物化視圖對象;

ü  從源數據表中將數據加載到Interim中;

ü  創建物化視圖日志;

如果在這個過程中,發生DML操作,也就是說在start過程和之后有DML操作,有新數據插入到其中。

SQL> select max(object_id) from t;

MAX(OBJECT_ID)

--------------

         76847

Executed in 0 seconds

SQL> insert into t select object_id+76847, object_name, created from dba_objects;

75199 rows inserted

Executed in 7.297 seconds

SQL> select count(*) from t;

  COUNT(*)

----------

    150391

Executed in 0.016 seconds

中間表的數據內容保持不變,并且物化視圖日志積累了需要刷新的數據條目。

SQL> select count(*) from t_interim;

  COUNT(*)

----------

     75192

Executed in 0.016 seconds

SQL> select count(*) from mlog$_t;

  COUNT(*)

----------

     75199

Executed in 0.016 seconds

此時存在數據的不一致和不統一。Oracle推薦要求使用sysnc_interim_table方法將重定義過程中出現的變化數據刷新。

SQL> exec dbms_redefinition.sync_interim_table('SCOTT','T','T_INTERIM');

PL/SQL procedure successfully completed

Executed in 195.937 seconds

刷新7萬左右數據,使用了超過三分鐘時間。在這個過程中,我們可以看到刷新物化視圖過程。

SQL> select * from v$mvrefresh;

       SID    SERIAL# CURRMVOWNER                     CURRMVNAME

---------- ---------- ------------------------------- -------------------------------

        47         13 SCOTT                           T_INTERIM

刷新開始和結束過程,我們可以看到物化視圖刷新過程中的時間變化。

SQL> select name, LAST_REFRESH from user_mview_refresh_times;

NAME       LAST_REFRESH

---------- --------------------

T_INTERIM  2013-9-10 9:07:01

SQL> select name, LAST_REFRESH from user_mview_refresh_times;

NAME       LAST_REFRESH

---------- --------------------

T_INTERIM  2013-9-10 9:15:28

結束后,我們發現interim表和mlog$_t日志表數據的變化。

SQL> select count(*) from t_interim;

  COUNT(*)

----------

    150391

Executed in 0.016 seconds

--無變化數據需要刷新了

SQL> select count(*) from mlog$_t;

  COUNT(*)

----------

         0

Executed in 0.016 seconds

綜合上面的實驗,我們知道方法sync_interim_table的實質是進行一次物化視圖快速刷新。這個方法持續的時間根據不同數據量和物化視圖刷新算法來決定,這個過程中,并不會引起很多鎖定動作。而且,在在線重定義過程中,這個方法是可以重復執行多次的。

下面,需要將原有數據表中的約束關系刷新到目標結構上。

SQL> set serveroutput on;

SQL> declare

  2    error_count number:=0;

  3  begin

  4    dbms_redefinition.copy_table_dependents(uname => 'SCOTT',orig_table => 'T',int_table => 'T_INTERIM',

  5                                            copy_indexes => dbms_redefinition.cons_orig_params,

  6                                            num_errors => error_count);

  7    dbms_output.put_line(to_char(error_count));

  8  end;

  9  /

0

PL/SQL procedure successfully completed

Finish過程主要完成六個步驟操作:

ü  執行sysnc_interim_table命令,將中間表數據盡可能靠近源數據表;

ü  鎖定源數據表T,使之后不能有任何變化發生在這個數據表上;

ü  再次執行sysnc_interim_table命令,這個時候執行的時間不會很長;

ü  將源數據表和Interim數據表表名進行置換;

ü  注銷unregistered物化視圖,并且刪除掉物化視圖日志;

ü  釋放開在中間表上的鎖定;

SQL> exec dbms_redefinition.finish_redef_table('SCOTT','T','T_INTERIM');

PL/SQL procedure successfully completed

Executed in 1.953 seconds

SQL> select count(*) from mlog$_t;

select count(*) from mlog$_t

ORA-00942: 表或視圖不存在

檢查處理結果。

--按照原定計劃,數據表變化成功;

SQL> desc t;

Name          Type          Nullable Default Comments

------------- ------------- -------- ------- --------

OBJECT_ID     NUMBER        Y                        

OBJECT_NAME_2 VARCHAR2(128) Y                        

CREATED       TIMESTAMP(6)  Y                        

SQL> exec dbms_stats.gather_table_stats(user,'T',cascade => true);

PL/SQL procedure successfully completed

Executed in 2.719 seconds

分區和主鍵對象實現成功。

SQL> select partition_name from user_tab_partitions where table_name='T';

PARTITION_NAME

------------------------------

P1

P2

P3

Executed in 0.062 seconds

SQL> select constraint_name, constraint_type from user_constraints where table_name='T';

CONSTRAINT_NAME                CONSTRAINT_TYPE

------------------------------ ---------------

PK_T                           P

Executed in 0.062 seconds

我們之前討論的都是單表情況下的處理,如果是涉及到多表關系,例如外鍵關系表下的重定義,是怎么處理呢?

關于Oracle Online Redefinition在線重定義的示例分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

赣榆县| 介休市| 乐昌市| 嘉禾县| 西乌珠穆沁旗| 西丰县| 阿拉善盟| 东方市| 舞阳县| 白银市| 隆尧县| 黑龙江省| 张家界市| 应城市| 巨野县| 崇义县| 滦平县| 平凉市| 阿城市| 萨嘎县| 南京市| 海晏县| 固阳县| 岑巩县| 历史| 濮阳县| 扬州市| 武邑县| 郧西县| 宣武区| 望都县| 黄冈市| 冷水江市| 邵阳市| 临桂县| 镇坪县| 望谟县| 尉氏县| 桐庐县| 柳河县| 开远市|