CREATE MATERIALIZED VIEW Material_View_Name
[TABLESPACE TBS_XXX]
REFRESH [ON DEMAND (預設)/ COMMIT] [COMPLETE / FORCE (預設) / FAST] [WITH Primary Key (預設)/ ROWID / ROWID / OBJECT ID]
[START WITH SYSDATE NEXT (SYSDATE+1)]
AS
SELECT SQL
--以上 SQL 的順序是有意義的, 必須注意.

Refresh Interval
DEMAND: 分為自動跟手動,手動就是當需要refrest mview時執行 dbms_mview.refresh; 自動就是在create mview 時指定排程時間,會增加一個job在 dba_jobs定時refresh
COMMIT: master table 資料有異動的時候,transaction commit時 refresh mview。 (即時同步)

Refresh Type
COMPLETE: 每次refresh 時重新執行 mview Query 且重新建置 mview (費時)(文件中提到如果是 complete,mview 的 pctfree 會是0,pctused 會是 99,十分合理,因為這mview 每次都會重新建置,不需要留空間update使用)
FAST: refresh mview 只更新 master 異動的資料 (較快但要建 mview log)
FORCE: refresh mview 時,會嘗試以 FAST 方式 refresh,如果無法完成則以 COMPLETE 方式 refresh

Replication situations
# Primary Key Materialized Views
# Object Materialized Views
# ROWID Materialized Views
# Complex Materialized Views

手動更新
BEGIN
DBMS_MVIEW.REFRESH( 'Material_View_Name' );
END;


mview 心得: 建立 mview 的時候,oracle會建立一個table,而這個table的ddl就是取自建立時的ddl
所以考慮以下問題:
1. 比較建立mv時 "指定欄位" 和 "欄位用*", 當src增加欄位會有什麼問題?
=> 做mv refresh時指定欄位不會有問題, 不過oracle也不可能幫你為mv增加欄位, 因為對應於mv的table ddl在mv建立時就建好了;
欄位用*的做mv refresh會發生error, 因為它會撈到src新增的欄位, 但因為對應於mv的table ddl在mv建立時就建好了, 所以該table沒有此新增的欄位, 因此error

2. src欄位名稱改變或長度改變
=> 因為對應於mv的table ddl在mv建立時就建好了, 因此做mv refresh都會有問題, 必須一起修改對應於mv的table ddl

P.S. 做mv refresh當發生error的時候, 若refresh complete的mv資料會全部被清掉; 而refresh fast的mv資料仍會保留在上一次的狀態

CREATE MATERIALIZED VIEW

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 py3939 的頭像
    py3939

    老爹寫程式

    py3939 發表在 痞客邦 留言(0) 人氣()