Oracle的實體化視圖提供了強大的功能,可以用在不同的環境中,實體化視圖和表一樣可以直接進行查詢。實體化視圖可以基於分區表,實體化視圖本身也可以分區。
主要用於預先計算並保存表連接或聚集等耗時較多的操作的結果, 這樣,在執行查詢時,就可以避免進行這些耗時的操作,而從快速的得到結果。在數據倉庫中,還經常使用查詢重寫(query rewrite)機制,這樣不需要修改原有的查詢語句,Oracle會自動選擇合適的實體化視圖進行查詢,完全對應用透明。實體化視圖和表一樣可以直接進 行查詢。
實體化視圖還用於復制、移動計算,遠程同步等方面。
實體化視圖有很多方面和索引很相似:使用實體化視圖的目的是為了提高查詢性能;實體化視圖對應用透明,增加和刪除實體化視圖不會影響應用程序中SQL語句的正確性和有效性;實體化視圖需要占用存儲空間;當基表發生變化時,實體化視圖也應當刷新。
materialized view 同snapshot是同一個概念。但同view是不一樣的:
1)物化視圖是存儲數據的視圖,存儲了基礎表的全部或者一部分數據,主要用作sql語句的優化,查詢物化視圖比查詢表中的數據速度要快;
2)MV是自動刷新或者手動刷新的,View不用刷新;
3) MV也可以直接update,但是不影響base table,對View的update反映到base table上;
4)MV主要用於遠程數據訪問,mv中的數據需要占用磁盤空間,view中不保存數據
使用語法:
CREATE MATERIALIZED VIEW XX
REFRESH [[fast | complete | force]
[on demand | commit]
[start with date]
[next date]
[with {primary key | rowid}]
]
[ENABLE | DISABLE] QUERY REWRITE
Refresh 刷新子句
描述 當基表發生了DML操作后,實體化視圖何時采用哪種方式和基表進行同步
取值 FAST 采用增量刷新,只刷新自上次刷新以后進行的修改
COMPLETE 對整個實體化視圖進行完全的刷新
FORCE(默認) Oracle在刷新時會去判斷是否可以進行快速刷新,如果可以則采用Fast方式,否則采用Complete的方式,Force選項是默認選項
ON DEMAND(默認) 實體化視圖在用戶需要的時候進行刷新,可以手工通過 DBMS_MVIEW.REFRESH等方法來進行刷新,也可以通過JOB定時進行刷新
ON COMMIT 實體化視圖在對基表的DML操作提交的同時進行刷新
START WITH 第一次刷新時間
NEXT 刷新時間間隔
WITH PRIMARY KEY(默認) 生成主鍵實體化視圖,也就是說實體化視圖是基於表的主鍵,而不是ROWID(對應於ROWID子句)。 為了生成PRIMARY KEY子句,應該在表上定義主鍵,否則應該用基於ROWID的實體化視圖。主鍵實體化視圖允許識別實體化視圖表而不影響實體化視圖增量刷新的可用性
REWRITE 字句
包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE兩種。
分別指出創建的實體化視圖是否支持查詢重寫。查詢重寫是指當對實體化視圖的基表進行查詢時,Oracle會自動判斷能否通過查詢實體化視圖來得到結果,如果可以,則避免了聚集或連接操作,而直接從已經計算好的實體化視圖中讀取數據
默認 DISABLE QUERY REWRITE
eg:
create materialized view YTMDM.MV_MDM_DISTRICT
refresh force on demand
start with to_date('19-11-2013 11:44:35', 'dd-mm-yyyy hh24:mi:ss') next sysdate + 1/24
as
SELECT ID,
CODE,
NAME,
DISTRICT_LEVEL,
GET_PARENT_DISTRICT(FULL_PATH_ID, 1) AS COUNTRY,
GET_PARENT_DISTRICT(FULL_PATH_ID, 2) AS PROV,
GET_PARENT_DISTRICT(FULL_PATH_ID, 3) AS CITY,
GET_PARENT_DISTRICT(FULL_PATH_ID, 4) AS TOWN
FROM YTMDM.T_MDM_DISTRICT
WHERE STATUS = 'VALID';