摘要:《Materialized Views》
2010/2/17
雖然工作環境資料庫是以OLTP架構設計 (其實是 oracle 安裝時預設環境的緣故),
且軟體及資料因為綁的很緊,無法將舊資料搬離目前的production,
在沒有完整的配套措施之前,資料勢必會持續成長,也就造成一些日常報表越跑越久。
日前因為專案需求,須搜尋資料表中特定資料,當初建置時絕不會有考量到此運用,
所以檔案架構及索引建置並無法加快資料的查詢,這點相信在OLTP 架構運作久了,
DW (Data Warehouse) 的需求也會相應產生。
這次因資料庫升級專案,又重上了一次 oracle 課程;
將課程內容應用到工作上,是個不錯的經驗。
而materialized view (以下簡稱為mview) 便成了本次專案以硬碟空間換取時間的最佳選擇。
這邊講述一些個人心得,如果有錯還請不吝指教。
View & mview 比較:
1. View 的好處是 oracle 不需要重新 compile 執行計劃,執行計劃在create view的時候已經建置並儲存。
2. mview 的好處是有實體的資料;可以建置 index,當成一般Table使用。
3. mview 的另一個好處是有Query rewrite的功能。
mview 適用的情況:
文件上寫到下面四點:
1.Ease Network Loads
理解: 遠端資料庫存取時,通常是採用Database link存取,因為跨越網路、不同資料庫間最佳執行計劃的產生及硬體問題,常常無法有較好的存取效。
而且當遠端資料庫crash時,軟體須作好例外處理,無疑加重了程式設計師編寫的困難;如果遠端資料庫又是由外包廠商管理時,
當SQL無法得到有效率存取,要求建置索引或是調整資料表時,就顯得綁手綁腳。此時mview可以將遠端資料庫同步到本機資料庫上,當成實體自有
Table,DBA就可以有效的管理此資料表,
例如建置需要的索引。
2.Create a Mass Deployment Environment
3.Enable Data Subsetting
理解: 符合本次專案的情況,運用在需要大型資料表中少部份特定資料的情形。參考的資料變少當然對整個SQL的效率會提升不少。
4.Enable Disconnected Computing
mview 的類型:
1.Primary Key Materialized Views (default)
2.Object Materialized Views
3.ROWID Materialized Views
4.Complex Materialized Views
不同的類型在資料refresh時有不同的限制;
例如:Complex Materialized Views refresh 時,會重新執行指定的Query,建議使用在資料量較小、SQL指令回應較快的需求上,
資料量大或SQL需較長時間的需求在refresh時所需資源也很可觀。
mview refresh(僅列舉部份內容):
1. 定時 refresh
2. commit 時同步 (資料即時且正確)
3. complete
如果來源資料表資料量大時,MATERIALIZED VIEW LOG (來源Table資料異動表,同步完成後即此異動表的資料會被刪除) 建議要建起來,在refresh時
加快不少速度。
參考文件:
Materialized View Concepts and Architecture
http://download.oracle.com/docs/cd/B10501_01/server.920/a96567/repmview.htm#25391
CREATE MATERIALIZED VIEW
http://download.oracle.com/docs/cd/B10501_01/server.920/a96540/statements_63a.htm#SQLRF01302
CREATE MATERIALIZED VIEW LOG
http://download.oracle.com/docs/cd/B10501_01/server.920/a96540/statements_64a.htm#2064933
參考資料表:
SELECT * FROM DBA_MVIEWS
SELECT * FROM DBA_MVIEW_LOGS
SELECT * FROM DBA_JOBS
2010/2/18 補充:
mview refresh mode:
DEMAND: 分為自動跟手動,手動就是當需要refrest mview時執行 dbms_mview.refresh 或是 dbms_refresh.refresh;
自動就是在create mview 時指定排程時間,會增加一個job在 dba_jobs定時refresh
COMMIT: master table 資料有異動的時候,transaction commit時 refresh mview。 (即時同步)
mview refresh method:
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
----------------------------------------------------
2012-04-11 補充
REFRESH ON COMMIT 必須有PRIMARY KEY 否則可以寫 REFRESH WITH ROWID ON COMMIT