Decode360's Blog

          業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
            302 隨筆 :: 26 文章 :: 82 評論 :: 0 Trackbacks
          為了對物化視圖的一些性能進行測試,做了幾個簡單的實驗:
          ?
          ?
          1、首先在實例A中創建表T8:
          ?

          create table t8 (i int primary key ,a number ,n varchar2 ( 100 ));

          insert into t8 values ( 1 , 10 , 'aaaaaaaaaaa' );

          insert into t8 values ( 2 , 20 , 'bbbbbbbbbbb' );

          insert into t8 values ( 3 , 30 , 'ccccccccccc' );

          insert into t8 values ( 4 , 40 , 'ddddddddddd' );

          insert into t8 values ( 5 , 50 , 'eeeeeeeeeee' );

          insert into t8 values ( 6 , 60 , 'fffffffffff' );

          insert into t8 values ( 7 , 70 , 'ggggggggggg' );

          commit ;

          ?

          2、在實例B中創建A的DBLINK temp_link

          ?

          create public database link temp_link

          connect to wxq identified by wxq

          using 'SID' ;

          ?

          3、在實例B中創建物化視圖wxq_mv:

          ?

          create materialized view wxq_mv

          tablespace wxq_tbs

          build deferred ? -- 延遲刷新不立即刷新 ,immediate 為立即刷新

          refresh force ?? -- 如果可以快速刷新則進行快速刷新,否則完全刷新

          on demand ?????? -- 按照指定方式刷新,遠程復制不能使用 commit

          start with to_date( '10-09-2008 16:45:10' , 'dd-mm-yyyy hh24:mi:ss' )

          next sysdate + 1

          with primary key

          as

          select t.*, sysdate mydate from t8@temp_link t;

          ?

          注1:這個過程遇到一個錯誤,在next子句后面加了注釋后編譯報錯,暈,搞了N久才發現。

          注2:發現在MV自動自制JOB后到了時間沒有觸發,查了下資料,是JOB_QUEUE_INTERVA參數設置為0,alter system set job_queue_processes=10后可以自動運行。

          注3:手動運行job——execute dbms_job.run(21)

          ?

          ?

          4、檢查數據:

          ?

          執行job刷新視圖后查詢數據:

          ?

          SQL> execute dbms_job.run(26);
          ?
          PL/SQL procedure successfully completed

          ?

          SQL> column i format a5
          SQL> column a format a5

          SQL> column n format a15

          SQL> column mydate format a20
          ?
          SQL> select * from wxq_mv;
          ?
          ??? I???? A N?????????????? MYDATE
          ----- ----- --------------- --------------------
          ??? 1??? 10 aaaaaaaaaaa???? 2008-9-10 17:41:38
          ??? 2??? 20 bbbbbbbbbbb???? 2008-9-10 17:41:38
          ??? 3??? 30 ccccccccccc???? 2008-9-10 17:41:38
          ??? 4??? 40 ddddddddddd???? 2008-9-10 17:41:38
          ??? 5??? 50 eeeeeeeeeee???? 2008-9-10 17:41:38
          ??? 6??? 60 fffffffffff???? 2008-9-10 17:41:38
          ??? 7??? 70 ggggggggggg???? 2008-9-10 17:41:38
          ?
          7 rows selected

          ?

          在A實例中修改數據:

          ?

          SQL> update t8 set a=100 where i=1;
          ?
          1 row updated
          ?
          SQL> commit;
          ?
          Commit complete

          ?

          再從B實例中查詢數據:

          ?

          SQL> execute dbms_job.run(26);
          ?
          PL/SQL procedure successfully completed
          ?
          SQL> select * from wxq_mv;
          ?
          ??? I???? A N?????????????? MYDATE
          ----- ----- --------------- --------------------
          ??? 1?? 100 aaaaaaaaaaa???? 2008-9-10 17:47:20
          ??? 2??? 20 bbbbbbbbbbb???? 2008-9-10 17:47:20
          ??? 3??? 30 ccccccccccc???? 2008-9-10 17:47:20
          ??? 4??? 40 ddddddddddd???? 2008-9-10 17:47:20
          ??? 5??? 50 eeeeeeeeeee???? 2008-9-10 17:47:20
          ??? 6??? 60 fffffffffff???? 2008-9-10 17:47:20
          ??? 7??? 70 ggggggggggg???? 2008-9-10 17:47:20
          ?
          7 rows selected

          ?

          從時間可以看到,是全部刷新的

          ?

          ?

          5、創建log后檢查數據:

          ?

          在A實例中創建materialized view log

          ?

          SQL> create materialized view log on t8 with rowid;

          Materialized view log created

          ?

          在B實例中建立的物化視圖:

          ?

          SQL> create materialized view wxq_mv2
          ? 2? tablespace wxq_tbs
          ? 3? build deferred? --延遲刷新不立即刷新,immediate為立即刷新
          ? 4? refresh fast??? --使用增量刷新
          ? 5? on demand?????? --按照指定方式刷新
          ? 6? start with to_date('10-09-2008 16:45:10', 'dd-mm-yyyy hh24:mi:ss')
          ? 7? next sysdate + 1
          ? 8? with rowid
          ? 9? as
          ?10? select * from t8@temp_link?t;
          ?
          Materialized view created

          ?

          注:這里不能加入sysdate字段了,因為遠程快速刷新只能是簡單的表復制

          ??? 只有創建materialized view log 后才可以refresh fast

          ?

          ?

          6、查看已經創建的materialized view:

          ?

          SQL> select query from dba_mviews where mview_name='WXQ_MV2';
          ?
          QUERY
          --------------------------------------------------------------------------------
          SELECT "T"."I" "I","T"."A" "A","T"."N" "N" FROM
          "T8"@TEMP_LINK.SINATAY.COM "T"

          ?

          發現已經把*自動轉化為每個列名,這跟view是一樣的

          所以,當遠程數據庫A增加列時,對本地B的mv不產生影響,B將忽略新增的列

          但是當A改變原有的列名,或刪除了B的mv引用的列名時,mv更新時就會報錯

          ?

          ?

          7、物化視圖將新建一個表、一個job:

          ?

          SQL> select owner,table_name,tablespace_name from dba_tables where table_name='WXQ_MV2';
          ?
          OWNER????????????????????????? TABLE_NAME???????????????????? TABLESPACE_NAME
          ------------------------------ ------------------------------ ------------------------------
          WANGXIAOQI???????????????????? WXQ_MV2??????????????????????? WXQ_TBS
          ?
          SQL>?desc WXQ_MV2
          Name Type????????? Nullable Default Comments
          ---- ------------- -------- ------- --------
          I??? INTEGER????????????????????????????????
          A??? NUMBER??????? Y????????????????????????
          N??? VARCHAR2(100) Y???

          ?

          SQL> select job,log_user,last_date,last_sec,next_date,next_sec,interval,what from user_jobs;
          ?
          JOB?? LOG_USER????????LAST_DATE????LAST_SEC????NEXT_DATE?? NEXT_SEC??INTERVAL???? WHAT
          ----- --------------- ------------ ----------- ----------- --------- ------------ ----------------------------------------------

          29??? WANGXIAOQI??????2008-9-17? ? 09:48:10????2008-9-17?? 14:04:12??sysdate + 1? dbms_refresh.refresh('"WANGXIAOQI"."WXQ_MV2"');

          ?

          每個mv都會對應一個實體表和一個job

          ?

          ?

          8、查看是否會創建主鍵:

          ?

          當原始表T8沒有主鍵時,MV只能創建為with rowid模式

          當然生成的mv table也是沒有主鍵的

          ?

          當原始表T8含有主鍵時,必須要重新生成log,然后再創建mv時必須使用with primary key

          ?

          SQL> alter table t8 add constraint t8_key primary key(i);
          ?
          Table altered
          ?
          SQL> drop materialized view log on t8 ;
          ?
          Materialized view log dropped
          ?
          SQL> create materialized view log on t8 ;
          ?
          Materialized view log created

          SQL> select constraint_name,table_name,status from user_constraints where table_name='T8';
          ?
          CONSTRAINT_NAME??????????????? TABLE_NAME???????????????????? STATUS
          ------------------------------ ------------------------------ --------
          T8_KEY???????????????????????? T8???????????????????????????? ENABLED

          ?

          然后在B創建MV:

          ?

          SQL> create materialized view wxq_mv2
          ? 2? tablespace wxq_tbs
          ? 3? build deferred? --延遲刷新不立即刷新,immediate為立即刷新
          ? 4? refresh fast??? --使用增量刷新
          ? 5? on demand?????? --按照指定方式刷新
          ? 6? start with to_date('10-09-2008 16:45:10', 'dd-mm-yyyy hh24:mi:ss')
          ? 7? next sysdate + 1
          ? 8? with?primary key?? --使用rowid時報錯
          ? 9? as
          ?10? select * from t8@temp_link?t;
          ?
          Materialized view created

          ?

          SQL> select constraint_name,table_name,status from dba_constraints where table_name='WXQ_MV3';
          ?
          CONSTRAINT_NAME??????????????? TABLE_NAME???????????????????? STATUS
          ------------------------------ ------------------------------ --------
          T8_KEY???????????????????????? WXQ_MV3??????????????????????? ENABLED

          ?

          生成的表中已經含有主鍵和索引。

          ?

          ?

          ?

          9、關于使用on prebuilt table在已有表上建立MV的操作和應用:

          ?

          先創建一個新表T2:

          ?

          SQL> create table t2 (a int primary key,b varchar2(10));
          ?
          Table created

          ?
          創建對應的MV:


          SQL> create materialized view wxq_mv as select * from t2;
          ?
          Materialized view created

          ?
          已經生成了一個table和一個MV:


          SQL> select object_name,object_type from user_objects where object_name='WXQ_MV';
          ?
          OBJECT_NAME????????????????????????????????????????????????????????????????????? OBJECT_TYPE
          -------------------------------------------------------------------------------- ------------------
          WXQ_MV?????????????????????????????????????????????????????????????????????????? TABLE
          WXQ_MV?????????????????????????????????????????????????????????????????????????? MATERIALIZED VIEW
          ?

          刪除MV:


          SQL> drop materialized view wxq_mv;
          ?
          Materialized view dropped
          ?

          發現table和MV都已經被刪除:


          SQL> select object_name,object_type from user_objects where object_name='WXQ_MV';
          ?
          OBJECT_NAME????????????????????????????????????????????????????????????????????? OBJECT_TYPE
          -------------------------------------------------------------------------------- ------------------
          ?

          下面使用on prebuilt table來創建MV:
          先建一個新表T3用來存放MV


          SQL> create table t3 as select * from t2;
          ?
          Table created
          ?

          T3上建立MV:


          SQL> create materialized view T3 on prebuilt table as select * from t2;
          ?
          Materialized view created
          ?

          查看新建的MV,還是有table:


          SQL> select object_name,object_type from user_objects where object_name='T3';
          ?
          OBJECT_NAME????????????????????????????????????????????????????????????????????? OBJECT_TYPE
          -------------------------------------------------------------------------------- ------------------
          T3?????????????????????????????????????????????????????????????????????????????? TABLE
          T3?????????????????????????????????????????????????????????????????????????????? MATERIALIZED VIEW
          ?

          再刪除MV:


          SQL> drop materialized view t3;
          ?
          Materialized view dropped
          ?

          發現T3任然保留,其數據也保留到最后更新狀態:


          SQL> select object_name,object_type from user_objects where object_name='T3';
          ?
          OBJECT_NAME????????????????????????????????????????????????????????????????????? OBJECT_TYPE
          -------------------------------------------------------------------------------- ------------------
          T3?????????????????????????????????????????????????????????????????????????????? TABLE

          ?

          應用說明:可以先使用表基礎上的MV來進行增量更新,當需要切換數據庫數據時,斷開源數據庫,然后刪除MV即可

          缺點是MV針對的是對象,如果對象很多的話,建立起來比較麻煩。

          ?

          ?





          -The End-

          posted on 2008-09-04 11:22 decode360-3 閱讀(542) 評論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 巩留县| 铁岭县| 巴林左旗| 玉树县| 波密县| 新丰县| 梁山县| 含山县| 靖边县| 萍乡市| 兖州市| 昌吉市| 扶沟县| 崇左市| 惠水县| 会宁县| 公主岭市| 政和县| 晋江市| 团风县| 娄底市| 郎溪县| 克什克腾旗| 巴东县| 抚顺市| 河津市| 贵阳市| 延边| 汉中市| 洪江市| 高邮市| 秀山| 海伦市| 陆河县| 邯郸县| 永春县| 九龙坡区| 玛沁县| 鄂托克前旗| 伊金霍洛旗| 乌恰县|