物化視圖學習總結

--物化視圖的刪除
drop MATERIALIZED VIEW sn_table_name;
drop table sn_table_name;
-- 物化視圖的應用場景有兩種:1、用於查詢優化 2、用於高級複製

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

以下轉載自  tao_wei162   oracle物化視圖的兩個典型應用場景

物化視圖是oracle一個比較有特色的東西,自oracle9i起,應用非常廣泛,不像mysql,不支持原生物化視圖,要藉助flexviews去實現。物化視圖到底有什麼用呢?要回答這個問題,必須先搞清楚物化視圖與普通視圖的區別:

物化視圖是有一個與之對應的容器表的。容器表是一個跟物化視圖同名的“規則”的表,用於存儲查詢返回的結果集。這是物化視圖與普通視圖的根本區別,它是有儲存結果集的“物理存在”的,而普通視圖則沒有這個物理存在,只是一個虛表,每訪問一次,查詢就要執行一次基表訪問(不考慮cache)。

物化視圖的應用場景有兩種:1、用於查詢優化 2、用於高級複製,下面分別舉一些實際工作中的case來進行說明。

1、查詢優化。

某電信增值業務,在進程啓動的時候,需要加載一些重要的業務初始化數據(比如全球運營商的networkid、cc、ndc等基礎數據),這些業務初始化數據要從四個表中查詢獲取。爲了提高這部分數據的access性能,加快進程啓動速度,可以將這四個表的數據組合爲一個物化視圖,定義如下:

CREATE MATERIALIZED VIEW IRDB_NETWORKLIST
REFRESH FORCE ON COMMIT
AS
SELECT
   A.NETWORKID AS NETWORKID,
   A.NETWORKNAME AS NAME,
   C.CC AS CC,
   C.NDC AS NDC,
   B.MCC AS MCC,
   B.MNC AS MNC,
   A.NEWVISITINTERVAL AS NEWVISITINTERVAL,
   A.OUTNEWVISITINTERVAL AS OUTNEWVISITINTERVAL,
   D.MNP_ENABLED AS HASMNP,
   A.BRANDNAME AS BRANDNAME,
   A.LANGUAGECODE AS DEFAULTLANGUAGECODE,
   C.TIMEZONE AS TIMEZONE,
   A.NDD AS NDD,
   A.ZONEID AS ZONEID
FROM
IRDB_NETWORK_MASTER A, IRDB_NETWORK_GSM_DETAIL B, IRDB_NETWORK_CODES C, IRDB_COUNTRY_MASTER D
WHERE
A.NETWORKID = B.NETWORKID AND A.NETWORKID = C.NETWORKID AND A.COUNTRYID = D.COUNTRYID AND A.STATUS = '1' AND C.STATUS = '1'

 

後續當我們對IRDB_NETWORK_MASTER、IRDB_NETWORK_GSM_DETAIL、IRDB_NETWORK_CODES和IRDB_COUNTRY_MASTER這四個業務基表中的任何一個或者多個進行DML commit的時候,物化視圖IRDB_NETWORKLIST就能自動更新了。當然了,基表與物化視圖的同步也是有一定代價的,但如果不建立物化視圖,那麼每次外部調用都會去查詢基表,而物化視圖會將這種壓力分散,將基表查詢、基表連接與外部業務接口訪問錯開,有利於降低數據庫負載的peak值,這也是數據庫性能優化的核心思想之一。

 

2、高級複製

很多業務場景,我們不需要對整個數據庫進行同步,只需要對部分表的部分字段進行同步,這個時候,物化視圖可以派上用場。下面是某直轄市移動彩鈴業務數據庫結構圖:

 

 

這裏,一臺P650小機作爲管理節點,負責業務開銷戶、業務話單等數據處理,其餘5臺P650小機作爲呼叫節點使用,只提供用戶數據的查詢功能。這裏不需要用DG等全庫同步的技術,因爲呼叫節點只需要同步部分與呼叫業務相關的數據。管理節點建立物化視圖,這裏以t_userinfo用戶表爲例:

CREATE MATERIALIZED VIEW                     

usdptemp.T_USERINFO_MV

REFRESH  FAST                                

AS                                           

selectPHONENUMBER,LOCALID,BRANDID,PAYKIND from usdp604.T_USERINFO@admin_node

 

在呼叫節點建立一個同義詞:

create or replace synonym T_USERINFO
 for T_USERINFO_mv;

這樣子可以保持和管理節點完全一樣的對象名稱。

然後建立一個刷新組,每10秒刷新一次物化視圖:

--create a refresh group

BEGIN   

   DBMS_REFRESH.MAKE(   

   name => 'usdpsync',   

    list => 'T_USERINFO_mv',   

    next_date=> sysdate,   

    interval => 'sysdate + 10/86400'   

);   

END;   

/

在初始化同步的時候,首先用臨時用戶從管理節點導出數據,注意表後跟上管理節點的global_name(與呼叫節點上建的dblink名稱一致),然後在呼叫節點上impdp數據,也就是說,呼叫節點上的物化視圖T_USERINFO_mv是基於管理節點上的基表物化視圖日誌建立的,這樣子就可以跟隨管理節點基表更新了。

 

物化視圖在使用過程中,還有幾點需要留意,在此羅列一下:

1、物化視圖有兩種刷新模式ON DEMAND和ON COMMIT,前者需要調用dbms_mview手工刷新,後者在基表提交的時候會自動刷新。如果建立物化視圖的時候不指定刷新方式,默認是ON DEMAND,此時一般需要建立一個job,在job裏按照某個固定週期調用dbms_mview進行刷新。

2、物化視圖日誌在建立時有多種選項:可以指定爲ROWID、PRIMARY KEY和OBJECT ID幾種類型,同時還可以指定SEQUENCE或明確指定列名。上面這些情況產生的物化視圖日誌的結構都不相同。

3、刷新方法有四種:fast、complete、force和never。
fast是增量刷新,只刷新上次刷新以後進行的修改。
complete是對整個物化視圖進行完全的刷新。
force,oracle在刷新時會判斷是否可以進行快速刷新,如果可以進行fast,否則進行complete
never,物化視圖不進行任何刷新。

如果要進行快速刷新,必須建立物化視圖日誌。物化視圖日誌命名規則爲mlog$_+基表名稱。
查看當前系統的物化視圖日誌表:
select * from dba_mview_logs;

force方式刷新則不需要建立物化視圖日誌。

 

4、如果物化視圖遇到同步問題,緊急情況下,可以執行手動刷新:

SQL> exec dbms_mview.refresh('IRDB_NETWORKLIST');
PL/SQL procedure successfully completed

此時會根據基表對IRDB_NETWORKLIST物化視圖進行刷新。

 

5、物化視圖日誌優化:

對於物化視圖日誌,我們可以建立索引提高性能。同時在排查同步慢等性能問題的時候也需要檢查看是否出現高水位,物化視圖日誌表的高水位會影響刷新性能,處理高水位的方法,在此省略。
————————————————
版權聲明:本文爲CSDN博主「tao_wei162」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/tao_wei162/article/details/84827869

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章