ORACLE中的物化視圖
物化視圖是包括一個查詢結果的數據庫對像,它是遠程數據的的本地副本,或者用來生成基於數據表求和的彙總表。物化視圖存儲基於遠程表的數據,也可以稱爲快照。
物化視圖可以查詢表,視圖和其它的物化視圖。
通常情況下,物化視圖被稱爲主表(在複製期間)或明細表(在數據倉庫中)。
對於複製,物化視圖允許你在本地維護遠程數據的副本,這些副本是隻讀的。如果你想修改本地副本,必須用高級複製的功能。當你想從一個表或視圖中抽取數據時,你可以用從物化視圖中抽取。
對於數據倉庫,創建的物化視圖通常情況下是聚合視圖,單一表聚合視圖和連接視圖。
本篇我們將會看到怎樣創建物化視圖並且討論它的刷新選項。
在複製環境下,創建的物化視圖通常情況下主鍵,rowid,和子查詢視圖。
1.主鍵物化視圖:
下面的語法在遠程數據庫表emp上創建主鍵物化視圖
SQL> CREATE MATERIALIZED VIEW mv_emp_pk
REFRESH FAST START WITH SYSDATE
NEXT SYSDATE + 1/48
WITH PRIMARY KEY
AS SELECT * FROM emp@remote_db;
Materialized view created.
注意:當用FAST選項創建物化視圖,必須創建基於主表的視圖日誌,如下:
SQL> CREATE MATERIALIZED VIEW LOG ON emp;
Materialized view log created.
2.Rowid物化視圖
下面的語法在遠程數據庫表emp上創建Rowid物化視圖
SQL> CREATE MATERIALIZED VIEW mv_emp_rowid
REFRESH WITH ROWID
AS SELECT * FROM emp@remote_db;
Materialized view log created.
3.子查詢物化視圖
下面的語法在遠程數據庫表emp上創建基於emp和dept表的子查詢物化視圖
SQL> CREATE MATERIALIZED VIEW mv_empdept
AS SELECT * FROM emp@remote_db e
WHERE EXISTS
(SELECT * FROM dept@remote_db d
WHERE e.dept_no = d.dept_no)
Materialized view log created.
REFRESH 子句
[refresh [fast|complete|force]
[on demand | commit]
[start with date] [next date]
[with {primary key|rowid}]]
Refresh選項說明:
a. oracle用刷新方法在物化視圖中刷新數據.
b. 是基於主鍵還是基於rowid的物化視圖
c. 物化視圖的刷新時間和間隔刷新時間
Refresh方法-FAST子句
增量刷新用物化視圖日誌(參照上面所述)來發送主表已經修改的數據行到物化視圖中.如果指定REFRESH FAST子句,那麼應該對主表創建物化視圖日誌
SQL> CREATE MATERIALIZED VIEW LOG ON emp;
Materialized view log created.
對於增量刷新選項,如果在子查詢中存在分析函數,則物化視圖不起作用。
Refresh方法- COMPLETE子句
完全刷新重新生成整個視圖,如果請求完全刷新,oracle會完成 完全刷新即使增量刷新可用。
Refresh Method – FORCE 子句
當指定FORCE子句,如果增量刷新可用Oracle將完成增量刷新,否則將完成完全刷新,如果不指定刷新方法(FAST, COMPLETE, or FORCE),Force選項是默認選項
主鍵和ROWD子句
WITH PRIMARY KEY選項生成主鍵物化視圖,也就是說物化視圖是基於主表的主鍵,而不是ROWID(對應於ROWID子句). PRIMARY KEY是默認選項,爲了生成PRIMARY KEY子句,應該在主表上定義主鍵,否則應該用基於ROWID的物化視圖.
主鍵物化視圖允許識別物化視圖主表而不影響物化視圖增量刷新的可用性。
Rowid物化視圖只有一個單一的主表,不能包括下面任何一項:
n Distinct 或者聚合函數.
n Group by,子查詢,連接和SET操作
刷新時間
START WITH子句通知數據庫完成從主表到本地表第一次複製的時間,應該及時估計下一次運行的時間點, NEXT 子句說明了刷新的間隔時間.
SQL> CREATE MATERIALIZED VIEW mv_emp_pk
REFRESH FAST
START WITH SYSDATE
NEXT SYSDATE + 2
WITH PRIMARY KEY
AS SELECT * FROM emp@remote_db;
Materialized view created.
在上面的例子中,物化視圖數據的第一個副本在創建時生成,以後每兩天刷新一次.
總結
物化視圖提供了可伸縮的基於主鍵或ROWID的視圖,指定了刷新方法和自動刷新的時間。