Decode360's Blog

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

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
          關于MV刷新的問題
          ?
          ??? 最近在工作中遇到一個問題,是關于物化視圖的刷新的,對實際數(shù)據(jù)產(chǎn)生了比較大的影響。雖然犯得錯誤很低級,主要是由于對一些概念的不清晰造成的,但是仍然覺得有必要將這個問題記下來,以免悲劇再次發(fā)生。
          ?
          ?
          ?
          ?
          ??? 這個錯誤還需要從materialized view的創(chuàng)建開始追溯,因為如果在create materialized view語句中加入start with 和 next 子句的話,創(chuàng)建MV的過程中會自動創(chuàng)建一個job,制定定期刷新計劃,例如:
          ?
          create materialized view t1_mv refresh fast
          start with to_date('21-07-2009 17:15:00', 'dd-mm-yyyy hh24:mi:ss')
          ? next TRUNC(SYSDATE,'HH')+375/1440
          ? with primary key
          ??? as select * from t1;
          ?
          SQL> select job, schema_user, interval, what from all_jobs;
          ?
          ?????? JOB SCHEMA_USER??????? INTERVAL??????????????????????????? WHAT
          ---------- ------------------ ----------------------------------- ----------------------------------------------
          ??????? 21 WANGXIAOQI???????? TRUNC(SYSDATE,'HH')+375/1440??????? dbms_refresh.refresh('"WANGXIAOQI"."T1_MV"');
          ?
          SQL>
          ?
          ??? 可以看到,這個job中的執(zhí)行內(nèi)容是:dbms_refresh.refresh('"WANGXIAOQI"."T1_MV"'); 而不是我們普通手動刷新MV時用的 dbms_mview.refresh 。
          ?
          ?
          ?
          ?
          ?
          ?
          ??? 再來研究一下dbms_refresh這個數(shù)據(jù)包,這個包是用于產(chǎn)生一個刷新組以方便MV一組為單位統(tǒng)一刷新的。而當MV被制定刷新策略的方式指定時,會自動創(chuàng)建一個刷新組,并將該MV添加至這個刷新組中,所以job可以使用dbms_refresh.refresh來進行刷新。可以來看一下:
          ?
          SQL> select rowner, rname, job, interval from all_refresh where rname = 'T1_MV';
          ?
          ROWNER?????????????? RNAME?????????????????? JOB INTERVAL
          -------------------- ---------------- ---------- ----------------------------------------
          WANGXIAOQI?????????? T1_MV??????????????????? 21 TRUNC(SYSDATE,'HH')+375/1440
          ?
          ??? 再看這個組的成員:
          ?
          SQL> select rowner, rname, job, interval from all_refresh_children where rname = 'T1_MV';
          ?
          ROWNER?????????????? RNAME?????????????????? JOB INTERVAL
          -------------------- ---------------- ---------- ----------------------------------------
          WANGXIAOQI?????????? T1_MV??????????????????? 21 TRUNC(SYSDATE,'HH')+375/1440
          ?
          ??? 可以看到只有這個物化視圖本身。
          ?
          ??? 所以當物化視圖刷新腳本自動執(zhí)行時,刷新的是你所創(chuàng)建的MV的名字命名的刷新組,而不是單純得刷新這個MV。 注:關于具體如何使用dbms_refresh來創(chuàng)建刷新組、添加成員、進行刷新等操作,可以參見以下地址:http://www.lansz.com/html/2009/06/mview_step_by_step_05.html
          ?
          ?
          ?
          ?
          ?
          ??? 這新一次的物化視圖創(chuàng)建中,沒有指定執(zhí)行時間,而是單純得創(chuàng)建,所以Oracle不會創(chuàng)建刷新組,如下:
          ?
          SQL>
          SQL> create materialized view t1_mv_2 refresh fast
          ? 2????? as select * from t1;
          ?
          Materialized view created

          SQL> select rowner, rname, job, interval from all_refresh_children where rname = 'T1_MV_2';
          ?
          ROWNER?????????????? RNAME?????????????????? JOB INTERVAL
          -------------------- ---------------- ---------- ----------------------------------------

          SQL>
          ?
          ??? 所以,如果對dbms_refresh了解不清的情況下,會造成無法刷新的情況,如果對沒有創(chuàng)建刷新組的對象進行刷新就報錯:
          ?
          SQL> exec dbms_refresh.refresh('T1_MV_2');
          ?
          begin dbms_refresh.refresh('T1_MV_2'); end;
          ?
          ORA-23404: refresh group "WANGXIAOQI"."T1_MV_2" does not exist
          ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
          ORA-06512: at "SYS.DBMS_REFRESH", line 23
          ORA-06512: at "SYS.DBMS_REFRESH", line 195
          ORA-06512: at line 2
          ?
          SQL> exec dbms_mview.refresh('T1_MV_2');
          ?
          PL/SQL procedure successfully completed


          ?
          ?
          ??? 另外還需要注意一點,如果刪除了某個MV,則會連同創(chuàng)建的fresh group同時刪除,需要在實際操作中注意。
          ?
          ?
          ?
          ?
          posted on 2009-08-31 22:41 decode360 閱讀(1878) 評論(1)  編輯  收藏 所屬分類: 07.Oracle

          評論

          # re: 關于MV刷新的問題 2015-07-14 11:54 YYJ
          GOOD!!!!!!!!!!  回復  更多評論
            

          主站蜘蛛池模板: 凌云县| 宁陵县| 永仁县| 界首市| 洛隆县| 揭东县| 大余县| 丹寨县| 汾西县| 自治县| 克拉玛依市| 凤庆县| 太谷县| 平山县| 宜黄县| 高唐县| 文山县| 临颍县| 慈溪市| 武安市| 嘉义市| 丁青县| 大悟县| 河北区| 贡嘎县| 太和县| 沙雅县| 顺昌县| 镇原县| 淮南市| 普兰县| 连山| 郁南县| 安康市| 睢宁县| 嵊州市| 上杭县| 湖北省| 玉山县| 宁津县| 靖安县|