oracle物化檢視

mrhaozi發表於2009-12-11

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上建立基於empdept表的子查詢物化檢視

             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的檢視,指定了重新整理方法和自動重新整理的時間。

二、------------------------------------------------------------------------------------------

Oracle的物化檢視提供了強大的功能,可以用於預先計算並儲存表連線或聚集等耗時較多的操作的結果,這樣,在執行查詢時,就可以避免進行這些耗時的操作,而從快速的得到結果。物化檢視有很多方面和索引很相似:使用物化檢視的目的是為了提高查詢效能;物化檢視對應用透明,增加和刪除物化檢視不會影響應用程式中SQL語句的正確性和有效性;物化檢視需要佔用儲存空間;當基表發生變化時,物化檢視也應當重新整理。

物化檢視可以分為以下三種型別:包含聚集的物化檢視;只包含連線的物化檢視;巢狀物化檢視。三種物化檢視的快速重新整理的限制條件有很大區別,而對於其他方面則區別不大。建立物化檢視時可以指定多種選項,下面對幾種主要的選擇進行簡單說明:

建立方式(Build Methods):包括BUILD IMMEDIATE和BUILD DEFERRED兩種。BUILD IMMEDIATE是在建立物化檢視的時候就生成資料,而BUILD DEFERRED則在建立時不生成資料,以後根據需要在生成資料。預設為BUILD IMMEDIATE。

查詢重寫(Query Rewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE兩種。分別指出建立的物化檢視是否支援查詢重寫。查詢重寫是指當對物化檢視的基表進行查詢時,Oracle會自動判斷能否透過查詢物化檢視來得到結果,如果可以,則避免了聚集或連線操作,而直接從已經計算好的物化檢視中讀取資料。預設為DISABLE QUERY REWRITE。

重新整理(Refresh):指當基表發生了DML操作後,物化檢視何時採用哪種方式和基表進行同步。重新整理的模式有兩種:ON DEMAND和ON COMMIT。ON DEMAND指物化檢視在使用者需要的時候進行重新整理,可以手工透過DBMS_MVIEW.REFRESH等方法來進行重新整理,也可以透過JOB定時進行重新整理。ON COMMIT指出物化檢視在對基表的DML操作提交的同時進行重新整理。重新整理的方法有四種:FAST、COMPLETE、FORCE和NEVE*。**ST重新整理採用增量重新整理,只重新整理自上次重新整理以後進行的修改。COMPLETE重新整理對整個物化檢視進行完全的重新整理。如果選擇FORCE方式,則Oracle在重新整理時會去判斷是否可以進行快速重新整理,如果可以則採用FAST方式,否則採用COMPLETE的方式。NEVER指物化檢視不進行任何重新整理。預設值是FORCE ON DEMAND。

在建立物化檢視的時候可以指定ORDER BY語句,使生成的資料按照一定的順序進行儲存。不過這個語句不會寫入物化檢視的定義中,而且對以後的重新整理也無效。

物化檢視日誌:如果需要進行快速重新整理,則需要建立物化檢視日誌。物化檢視日誌根據不同物化檢視的快速重新整理的需要,可以建立為ROWID或PRIMARY KEY型別的。還可以選擇是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。

可以指明ON PREBUILD TABLE語句將物化檢視建立在一個已經存在的表上。這種情況下,物化檢視和表必須同名。當刪除物化檢視時,不會刪除同名的表。這種物化檢視的查詢重寫要求引數QUERY_REWRITE_INTEGERITY必須設定為trusted或者stale_tolerated。

物化檢視可以進行分割槽。而且基於分割槽的物化檢視可以支援分割槽變化跟蹤(PCT)。具有這種特性的物化檢視,當基表進行了分割槽維護操作後,仍然可以進行快速重新整理操作。對於聚集物化檢視,可以在GROUP BY列表中使用CUBE或ROLLUP,來建立不同等級的聚集物化檢視。

物化檢視的基本操作和使用可以檢視網址:http://blog.itpub.net/post/468/13318 相關的東東。我主要說明一下使用物化檢視的基本東東。如如何建立在特定的表空間上,這些在其他的物化檢視上面幾乎都沒有任何介紹的。主要以我做的一個例子來操作,
如果對物化檢視的基本概念清楚了就比較明白在那裡寫特定的表空間儲存了。

建立物化檢視時應先建立儲存的日誌空間

CREATE MATERIALIZED VIEW LOG ON mv_lvy_levytaxbgtdiv
tablespace ZGMV_DATA --日誌儲存在特定的表空間
WITH ROWID ;
CREATE MATERIALIZED VIEW LOG ON tb_lvy_levydetaildata
tablespace ZGMV_DATA --日誌儲存在特定的表空間
WITH ROWID,sequence(LEVYDETAILDATAID);
CREATE MATERIALIZED VIEW LOG ON tb_lvy_levydata
tablespace ZGMV_DATA --日誌儲存在特定的表空間
WITH rowid,sequence(LEVYDATAID);
然後建立物化檢視
--建立物化檢視
create materialized view MV_LVY_LEVYDETAILDATA
TABLESPACE ZGMV_DATA --儲存表空間
BUILD DEFERRED --延遲重新整理不立即重新整理
refresh force --如果可以快速重新整理則進行快速重新整理,否則完全重新整理
on demand --按照指定方式重新整理
start with to_date('24-11-2005 18:00:10', 'dd-mm-yyyy hh24:mi:ss') --第一次重新整理時間
next TRUNC(SYSDATE+1)+18/24 --重新整理時間間隔
as
SELECT levydetaildataid, detaildatano, taxtermbegin, taxtermend,
......
ROUND(taxdeduct * taxpercent1, 2) - ROUND(taxdeduct * taxpercent2, 2) -
ROUND(taxdeduct * taxpercent3, 2) - ROUND(taxdeduct * taxpercent4, 2) -
ROUND(taxdeduct * taxpercent5, 2) taxdeduct, ROUND(taxfinal * taxpercent1, 2) -
ROUND(taxfinal * taxpercent2, 2) - ROUND(taxfinal * taxpercent3, 2) -
ROUND(taxfinal * taxpercent4, 2) - ROUND(taxfinal * taxpercent5, 2) taxfinal,
a.levydataid, a.budgetitemcode, taxtypecode,
......
FROM tb_lvy_levydetaildata a, tb_lvy_levydata c, MV_LVY_LEVYTAXBGTDIV b
WHERE a.levydataid = c.levydataid
AND a.budgetdistrscalecode = b.budgetdistrscalecode
AND a.budgetitemcode = b.budgetitemcode
AND c.incomeresidecode = b.rcvfisccode
AND C.TAXSTATUSCODE='08'
AND C.NEGATIVEFLAG!='9'
刪除物化檢視日誌
--刪除物化檢視:
--刪除日誌: DROP materialized view log on mv_lvy_levytaxbgtdiv;
DROP materialized view log on tb_lvy_levydetaildata;
DROP materialized view log on tb_lvy_levydata;
--刪除物化檢視 drop materialized view MV_LVY_LEVYDETAILDATA;
--基本和對錶的操作一致 --物化檢視由於是物理真實存在的,故可以建立索引。
建立方式和對普通表建立方式相同,就不在重複寫了。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16396910/viewspace-1029606/,如需轉載,請註明出處,否則將追究法律責任。

相關文章