Oracle物化檢視及Snapshot

tolywang發表於2008-08-20

            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,來建立不同等級的聚集物化檢視。 [Page]
如果對物化檢視的基本概念清楚了就比較明白在那裡寫特定的表空間儲存了。
建立物化檢視時應先建立儲存的日誌空間( 儲存物化試圖的物件的改變資訊)
CREATE MATERIALIZED VIEW LOG ON md_cdr_pim_day_01
tablespace ZGMV_DATA --日誌儲存在特定的表空間
WITH ROWID ;
然後建立物化檢視
--建立物化檢視
create materialized view MV_TEST
TABLESPACE ZGMV_DATA --儲存表空間
BUILD DEFERRED --延遲重新整理不立即重新整理
refresh force --如果可以快速重新整理則進行快速重新整理,否則完全重新整理
with rowid --根據rowid重新整理(預設是主鍵)
on demand --按照指定方式重新整理
start with to_date(’15-03-2008 16:20:51’, ’dd-mm-yyyy hh24:mi:ss’) next sysdate+1/48 
as
select DAY_NUMBER,STAT_DATE,USER_ID,MSISDN,

BRAND_ID,AREA_ID,PIM_CODE,OPER_CODE,
CARRIER_TYPE,CHARGE_TYPE,OPER_TYPE,

SEND_STATUS,USER_STATUS,
DATA_UP,DATA_DOWN,UP_CNT,DOWN_CNT,

INFO_FEE,OTHER_FEE,REAL_INFO_FEE,
REAL_OTHER_FEE,PIM_CNT,PERIOD_TIME
from jsdss.md_cdr_pim_day_01@to_bassm2
--刪除物化檢視:
--刪除日誌: 
DROP materialized view log on md_cdr_pim_day_01;
--刪除物化檢視 
drop materialized view MV_LVY_LEVYDETAILDATA;
--基本和對錶的操作一致
--物化檢視由於是物理真實存在的,故可以建立索引。
建立方式和對普通表建立方式相同.。  

 

 
 
 

-------------------------------------------------------------------------------------------------------

 

 

下面對物化檢視進行一下總結,供大家學習!

物化檢視的重新整理有二類,分別是:on commit ;on demand。
DO1T(u-B$["| t0重新整理方法有三種分別是:快速(FAST),完全(COMPLETE),強制(FORCE);**部落格首頁0q;|&K%T$kn"e-M%gq
ON COMMIT

如果選擇on commit ,則在對主表應用上會造成速度,這是因為ORACLE在對主表操作提交後馬上會進行重新整理物化檢視操作,這部分時間是也包括在提交時間中。

a) refresh force on commit:中對刪,新增記錄,物理檢視都能真實反映主表的變化。同時這種情況下不用建物化檢視日誌表。缺點是提交時間長。**部落格首頁_ Mhu*_a
b) refresh fast on commit:中對新增或修改能真實反映主表的變化,但對刪除則不能反映,必須進行一次完全重新整理。
ON DEMAND

DEMAND必須用DBMS_MVIEW.REFRESH儲存過程建立的JOB去定時重新整理物化檢視. 
a) refresh fast on DEMAND:必須透過呼叫DBMS_MVIEW.REFRESH儲存過程來進行快速重新整理反映主表新增情況;但當對主表中的資料刪除或修改時,快速重新整理則會報錯,因此必須調DBMS_MVIEW.REFRESH的完全重新整理才能反映。可以透過建立JOB解決。
快速重新整理:exec dbms_mview.refresh(v_advanceservice,'f');
完全重新整理:exec dbms_mview.refresh(v_advanceservice,'c');
要注意的是:用FAST重新整理物化檢視,前提要新建物化檢視日誌表。
refresh force/complate on DEMAND:

在這種方式下物化檢視也是無法自動重新整理,必須透過JOB或手工。
FAST、FORCE、COMPLETE區別
FAST:增量式重新整理,使用此方法必須有前提,就是建立物化檢視日誌表。
FORCE::如果可以以fast 方式重新整理則用,否則完全重新整理。
COMPLETE:預設的選項.先將物化檢視表內容刪除,然後再重新整理。此方式缺點就是在重新整理時間內高階搜尋將為空.

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

相關文章