Oracle的物化視圖
Posted on 2007-01-15 12:05 weibogao 閱讀(1677) 評(píng)論(0) 編輯 收藏 所屬分類: database development
Oracle
的物化視圖提供了強(qiáng)大的功能,可以用在不同的環(huán)境中。在不同的環(huán)境中,物化視圖的作用也不相同。
數(shù)據(jù)倉庫中的物化視圖主要用于預(yù)先計(jì)算并保存表連接或聚集等耗時(shí)較多的操作的結(jié)果,這樣,在執(zhí)行查詢時(shí),就可以避免進(jìn)行這些耗時(shí)的操作,而從快速的得到結(jié)果。在數(shù)據(jù)倉庫中,還經(jīng)常使用查詢重寫(
query rewrite
)機(jī)制,這樣不需要修改原有的查詢語句,
Oracle
會(huì)自動(dòng)選擇合適的物化視圖進(jìn)行查詢,完全對(duì)應(yīng)用透明。
物化視圖和表一樣可以直接進(jìn)行查詢。物化視圖可以基于分區(qū)表,物化視圖本身也可以分區(qū)。
除了在數(shù)據(jù)倉庫中使用,物化視圖還用于復(fù)制、移動(dòng)計(jì)算等方面。
物化視圖有很多方面和索引很相似:使用物化視圖的目的是為了提高查詢性能;物化視圖對(duì)應(yīng)用透明,增加和刪除物化視圖不會(huì)影響應(yīng)用程序中
SQL
語句的正確性和有效性;物化視圖需要占用存儲(chǔ)空間;當(dāng)基表發(fā)生變化時(shí),物化視圖也應(yīng)當(dāng)刷新。
物化視圖可以分為以下三種類型:包含聚集的物化視圖;只包含連接的物化視圖;嵌套物化視圖。三種物化視圖的快速刷新的限制條件有很大區(qū)別,而對(duì)于其他方面則區(qū)別不大。
創(chuàng)建物化視圖時(shí)可以指定多種選項(xiàng),下面對(duì)幾種主要的選擇進(jìn)行簡單說明:
創(chuàng)建方式(
Build Methods
):包括
BUILD IMMEDIATE
和
BUILD DEFERRED
兩種。
BUILD IMMEDIATE
是在創(chuàng)建物化視圖的時(shí)候就生成數(shù)據(jù),而
BUILD DEFERRED
則在創(chuàng)建時(shí)不生成數(shù)據(jù),以后根據(jù)需要在生成數(shù)據(jù)。默認(rèn)為
BUILD IMMEDIATE
。
查詢重寫(
Query Rewrite
):包括
ENABLE QUERY REWRITE
和
DISABLE QUERY REWRITE
兩種。分別指出創(chuàng)建的物化視圖是否支持查詢重寫。查詢重寫是指當(dāng)對(duì)物化視圖的基表進(jìn)行查詢時(shí),
Oracle
會(huì)自動(dòng)判斷能否通過查詢物化視圖來得到結(jié)果,如果可以,則避免了聚集或連接操作,而直接從已經(jīng)計(jì)算好的物化視圖中讀取數(shù)據(jù)。默認(rèn)為
DISABLE QUERY REWRITE
。
刷新(
Refresh
):指當(dāng)基表發(fā)生了
DML
操作后,物化視圖何時(shí)采用哪種方式和基表進(jìn)行同步。刷新的模式有兩種:
ON DEMAND
和
ON COMMIT
。
ON DEMAND
指物化視圖在用戶需要的時(shí)候進(jìn)行刷新,可以手工通過
DBMS_MVIEW.REFRESH
等方法來進(jìn)行刷新,也可以通過
JOB
定時(shí)進(jìn)行刷新。
ON COMMIT
指出物化視圖在對(duì)基表的
DML
操作提交的同時(shí)進(jìn)行刷新。刷新的方法有四種:
FAST
、
COMPLETE
、
FORCE
和
NEVER
。
FAST
刷新采用增量刷新,只刷新自上次刷新以后進(jìn)行的修改。
COMPLETE
刷新對(duì)整個(gè)物化視圖進(jìn)行完全的刷新。如果選擇
FORCE
方式,則
Oracle
在刷新時(shí)會(huì)去判斷是否可以進(jìn)行快速刷新,如果可以則采用
FAST
方式,否則采用
COMPLETE
的方式。
NEVER
指物化視圖不進(jìn)行任何刷新。默認(rèn)值是
FORCE ON DEMAND
。
在建立物化視圖的時(shí)候可以指定
ORDER BY
語句,使生成的數(shù)據(jù)按照一定的順序進(jìn)行保存。不過這個(gè)語句不會(huì)寫入物化視圖的定義中,而且對(duì)以后的刷新也無效。
物化視圖日志:如果需要進(jìn)行快速刷新,則需要建立物化視圖日志。物化視圖日志根據(jù)不同物化視圖的快速刷新的需要,可以建立為
ROWID
或
PRIMARY KEY
類型的。還可以選擇是否包括
SEQUENCE
、
INCLUDING NEW VALUES
以及指定列的列表。
可以指明
ON PREBUILD TABLE
語句將物化視圖建立在一個(gè)已經(jīng)存在的表上。這種情況下,物化視圖和表必須同名。當(dāng)刪除物化視圖時(shí),不會(huì)刪除同名的表。這種物化視圖的查詢重寫要求參數(shù)
QUERY_REWRITE_INTEGERITY
必須設(shè)置為
trusted
或者
stale_tolerated
。
物化視圖可以進(jìn)行分區(qū)。而且基于分區(qū)的物化視圖可以支持分區(qū)變化跟蹤(
PCT
)。具有這種特性的物化視圖,當(dāng)基表進(jìn)行了分區(qū)維護(hù)操作后,仍然可以進(jìn)行快速刷新操作。
對(duì)于聚集物化視圖,可以在
GROUP BY
列表中使用
CUBE
或
ROLLUP
,來建立不同等級(jí)的聚集物化視圖。
物化視圖的一些特性:
定位導(dǎo)致物化視圖無法快速刷新的原因:
http://blog.itpub.net/post/468/13318
物化視圖的快速刷新(一):
http://blog.itpub.net/post/468/14245
物化視圖的快速刷新(二):
http://blog.itpub.net/post/468/16456
物化視圖的快速刷新(三):
http://blog.itpub.net/post/468/16496
物化視圖是包括一個(gè)查詢結(jié)果的數(shù)據(jù)庫對(duì)像,它是遠(yuǎn)程數(shù)據(jù)的的本地副本,或者用來生成基于數(shù)據(jù)表求和的匯總表。物化視圖存儲(chǔ)基于遠(yuǎn)程表的數(shù)據(jù),也可以稱為快照。
物化視圖可以查詢表,視圖和其它的物化視圖。
通常情況下,物化視圖被稱為主表(在復(fù)制期間)或明細(xì)表(在數(shù)據(jù)倉庫中)。
對(duì)于復(fù)制,物化視圖允許你在本地維護(hù)遠(yuǎn)程數(shù)據(jù)的副本
,
這些副本是只讀的。如果你想修改本地副本,必須用高級(jí)復(fù)制的功能。當(dāng)你想從一個(gè)表或視圖中抽取數(shù)據(jù)時(shí),你可以用從物化視圖中抽取。
對(duì)于數(shù)據(jù)倉庫,創(chuàng)建的物化視圖通常情況下是聚合視圖,單一表聚合視圖和連接視圖。
本篇我們將會(huì)看到怎樣創(chuàng)建物化視圖并且討論它的刷新選項(xiàng)。
在復(fù)制環(huán)境下,創(chuàng)建的物化視圖通常情況下主鍵,
rowid,
和子查詢視圖。
1.
主鍵物化視圖:
下面的語法在遠(yuǎn)程數(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.
?????????????
注意:當(dāng)用
FAST
選項(xiàng)創(chuàng)建物化視圖,必須創(chuàng)建基于主表的視圖日志
,
如下
:
??????????? SQL> CREATE MATERIALIZED VIEW LOG ON emp;
??????????? Materialized view log created.
2.Rowid
物化視圖
?????????????
下面的語法在遠(yuǎn)程數(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.
子查詢物化視圖
?????????????
下面的語法在遠(yuǎn)程數(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
選項(xiàng)說明
:
a.????? oracle
用刷新方法在物化視圖中刷新數(shù)據(jù)
.
b.?????
是基于主鍵還是基于
rowid
的物化視圖
c.??????
物化視圖的刷新時(shí)間和間隔刷新時(shí)間
Refresh
方法
-FAST
子句
??????
增量刷新用物化視圖日志(參照上面所述)來發(fā)送主表已經(jīng)修改的數(shù)據(jù)行到物化視圖中
.
如果指定
REFRESH FAST
子句,那么應(yīng)該對(duì)主表創(chuàng)建物化視圖日志
??????????????????? SQL> CREATE MATERIALIZED VIEW LOG ON emp;
Materialized view log created.
對(duì)于增量刷新選項(xiàng),如果在子查詢中存在分析函數(shù),則物化視圖不起作用。
Refresh
方法
-COMPLETE
子句
完全刷新重新生成整個(gè)視圖,如果請求完全刷新,
oracle
會(huì)完成完全刷新即使增量刷新可用。
Refresh Method
–
FORCE
子句
當(dāng)指定
FORCE
子句,如果增量刷新可用
Oracle
將完成增量刷新,否則將完成完全刷新
,
如果不指定刷新方法
(FAST, COMPLETE, or FORCE),Force
選項(xiàng)是默認(rèn)選項(xiàng)
主鍵和
ROWD
子句
WITH PRIMARY KEY
選項(xiàng)生成主鍵物化視圖
,
也就是說物化視圖是基于主表的主鍵,而不是
ROWID(
對(duì)應(yīng)于
ROWID
子句
). PRIMARY KEY
是默認(rèn)選項(xiàng)
,
為了生成
PRIMARY KEY
子句,應(yīng)該在主表上定義主鍵,否則應(yīng)該用基于
ROWID
的物化視圖
.
主鍵物化視圖允許識(shí)別物化視圖主表而不影響物化視圖增量刷新的可用性。
Rowid
物化視圖只有一個(gè)單一的主表,不能包括下面任何一項(xiàng)
:
n???????? Distinct
或者聚合函數(shù)
.
n???????? Group by
,子查詢,連接和
SET
操作
刷新時(shí)間
??????
START WITH
子句通知數(shù)據(jù)庫完成從主表到本地表第一次復(fù)制的時(shí)間
,
應(yīng)該及時(shí)估計(jì)下一次運(yùn)行的時(shí)間點(diǎn)
, NEXT
子句說明了刷新的間隔時(shí)間
.
??????????? 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ù)的第一個(gè)副本在創(chuàng)建時(shí)生成,以后每兩天刷新一次
.
總結(jié)
物化視圖提供了可伸縮的基于主鍵或
ROWID
的視圖
,
指定了刷新方法和自動(dòng)刷新的時(shí)間。
?