Oracle DB 使用Materialized View
table/View/Materialized View 比較
是否落地 | 適用情境 | ||
TABLE | v | ||
View |
只有定義meta data未實際佔有space oracle 不需要重新 compile 執行計劃,執行計劃在create view的時候已經建置並儲存 |
||
Materialized View | v |
1.用來提高查詢的效能 2.同步資料、傳輸資料 |
實際佔有space 有實體的資料;可以建置 index,當成一般Table使用 |
1:建立 "不會自動更新資料" 的 Materialized View 語法
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
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使用)
如果來源資料表資料量大時,MATERIALIZED VIEW LOG (來源Table資料異動表,同步完成後即此異動表的資料會被刪除) 建議要建起來,在refresh時加快不少速度。
FAST: refresh mview 只更新 master 異動的資料 (較快但要建 mview log)
FORCE: refresh mview 時,會嘗試以 FAST 方式 refresh,如果無法完成則以 COMPLETE 方式 refresh
2.建立 "只要 Table Commit, 就會自動更新資料" 的 Materialized View 語法
CREATE MATERIALIZED VIEW Material_View_Name
REFRESH [COMPLETE / FORCE (預設) / FAST]
ON COMMIT
[WITH ROWID / WITH PRIMARY KEY (預設)]
AS
SELECT SQL
3.建立 "定期自動更新資料" 的 Materialized View 語法
CREATE MATERIALIZED VIEW Material_View_Name
REFRESH [COMPLETE / FORCE (預設) / FAST]
START WITH SYSDATE
NEXT (SYSDATE+1)
[WITH ROWID / WITH PRIMARY KEY (預設)]
AS
SELECT SQL
4."手動刷新" Materialized View 資料的語法
BEGIN
DBMS_MVIEW.REFRESH( 'Material_View_Name' );
END;
5.查詢 Materialized View 狀態的語法
SELECT MVIEW_NAME
, REFRESH_METHOD
, LAST_REFRESH_TYPE
, TO_CHAR(LAST_REFRESH_DATE, 'YYYYMMDD HH24:MI:SS') LAST_REFRESH_DATE
, QUERY
FROM SYS.DBA_MVIEWS;
mview 的類型:
# Primary Key Materialized Views
# Object Materialized Views
# ROWID Materialized Views
# Complex Materialized Views
不同的類型在資料refresh時有不同的限制;
例如:Complex Materialized Views refresh 時,會重新執行指定的Query,建議使用在資料量較小、SQL指令回應較快的需求上,
資料量大或SQL需較長時間的需求在refresh時所需資源也很可觀。
參考資料
1.使用 Materialized View 來同步資料
http://shingdong.blogspot.tw/2014/08/materialized-view.html
2.CREATE MATERIALIZED VIEW
http://py3939.pixnet.net/blog/post/25399529
3.Oracle Database 的 Materialized View 建立
http://tomkuo139.blogspot.tw/2010/01/oracle-database-materialized-view.html
4.《Materialized Views》
https://dotblogs.com.tw/sporting/2012/10/04/75263
5.《Materialized Views 專案實作經驗》
https://dotblogs.com.tw/sporting/2012/10/04/75264