?????
物化視圖是包括一個查詢結果的數(shù)據(jù)庫對像,它是遠程數(shù)據(jù)的的本地副本,或者用來生成基于數(shù)據(jù)表求和的匯總表。物化視圖存儲基于遠程表的數(shù)據(jù),也可以稱為快照。
??????
物化視圖可以查詢表,視圖和其它的物化視圖。
??????
通常情況下,物化視圖被稱為主表(在復制期間)或明細表(在數(shù)據(jù)倉庫中)。
??????
對于復制,物化視圖允許你在本地維護遠程數(shù)據(jù)的副本
,
這些副本是只讀的。如果你想修改本地副本,必須用高級復制的功能。當你想從一個表或視圖中抽取數(shù)據(jù)時,你可以用從物化視圖中抽取。
??????
對于數(shù)據(jù)倉庫,創(chuàng)建的物化視圖通常情況下是聚合視圖,單一表聚合視圖和連接視圖。
本文我們將會看到怎樣創(chuàng)建物化視圖并且討論它的刷新選項。
??????
在復制環(huán)境下,創(chuàng)建的物化視圖通常情況下主鍵,
rowid,
和子查詢視圖。
1.
主鍵物化視圖:
??????
??????
下面的語法在遠程數(shù)據(jù)庫表
emp
上創(chuàng)建主鍵物化視圖
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
選項創(chuàng)建物化視圖,必須創(chuàng)建基于主表的視圖日志
,
如下
:
??????SQL> CREATE MATERIALIZED VIEW LOG ON emp;Materialized view log created.
2.
Rowid
物化視圖
??????
??????
下面的語法在遠程數(shù)據(jù)庫表
emp
上創(chuàng)建
Rowid
物化視圖
SQL> CREATE MATERIALIZED VIEW mv_emp_rowid
REFRESH WITH ROWID
???? AS SELECT * FROM emp@remote_db;
Materialized view log created.
3.
子查詢物化視圖
??????
??????
下面的語法在遠程數(shù)據(jù)庫表
emp
上創(chuàng)建基于
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
用刷新方法在物化視圖中刷新數(shù)據(jù)
.
b.
?????
是基于主鍵還是基于
rowid
的物化視圖
c.
??????
物化視圖的刷新時間和間隔刷新時間
?
Refresh
方法
-FAST
子句
??????
增量刷新用物化視圖日志(參照上面所述)來發(fā)送主表已經(jīng)修改的數(shù)據(jù)行到物化視圖中
.
如果指定
REFRESH FAST
子句,那么應該對主表創(chuàng)建物化視圖日志
SQL> CREATE MATERIALIZED VIEW LOG ON emp;
Materialized view log created.
??????
對于增量刷新選項,如果在子查詢中存在分析函數(shù),則物化視圖不起作用。
?
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
或者聚合函數(shù)
.
n
????????
Group by
,子查詢,連接和
SET
操作
?
刷新時間
??????
??????
START WITH
子句通知數(shù)據(jù)庫完成從主表到本地表第一次復制的時間
,
應該及時估計下一次運行的時間點
, 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.
在上面的例子中,物化視圖數(shù)據(jù)的第一個副本在創(chuàng)建時生成,以后每兩天刷新一次
.
?
總結
物化視圖提供了可伸縮的基于主鍵或
ROWID
的視圖
,
指定了刷新方法和自動刷新的時間。