Oracle之物化視圖

Oracle之物化視圖

近期根據項目業務需要對oracle的物化視圖有所接觸,在網上搜尋關於這方面的資料,便於提高,整理內容如下:

物化視圖是一種特殊的物理表,“物化”(Materialized)視圖是相對普通視圖而言的。普通視圖是虛擬表,應用的侷限性大,任何對視圖的查詢,Oracle都實際上轉換爲視圖SQL語句的查詢。這樣對整體查詢性能的提高,並沒有實質上的好處。
1、物化視圖的類型:ON DEMAND、ON COMMIT

    二者的區別在於刷新方法的不同,ON DEMAND顧名思義,僅在該物化視圖“需要”被刷新了,才進行刷新(REFRESH),即更新物化視圖,以保證和基表數據的一致性;而ON COMMIT是說,一旦基表有了COMMIT,即事務提交,則立刻刷新,立刻更新物化視圖,使得數據和基表一致。
2、ON DEMAND物化視圖   

物化視圖的創建本身是很複雜和需要優化參數設置的,特別是針對大型生產數據庫系統而言。但Oracle允許以這種最簡單的,類似於普通視圖的方式來做,所以不可避免的會涉及到默認值問題。也就是說Oracle給物化視圖的重要定義參數的默認值處理是我們需要特別注意的。   

物化視圖的特點:

     (1) 物化視圖在某種意義上說就是一個物理表(而且不僅僅是一個物理表),這通過其可以被user_tables查詢出來,而得到佐證;

    (2) 物化視圖也是一種段(segment),所以其有自己的物理存儲屬性;

     (3) 物化視圖會佔用數據庫磁盤空間,這點從user_segment的查詢結果,可以得到佐證;

    創建語句:create materialized view mv_name as select * from table_name    默認情況下,如果沒指定刷新方法和刷新模式,則Oracle默認爲FORCE和DEMAND。
    物化視圖的數據怎麼隨着基表而更新?    Oracle提供了兩種方式,手工刷新和自動刷新,默認爲手工刷新。也就是說,通過我們手工的執行某個Oracle提供的系統級存儲過程或包,來保證物化視圖與基表數據一致性。這是最基本的刷新辦法了。自動刷新,其實也就是Oracle會建立一個job,通過這個job來調用相同的存儲過程或包,加以實現。

       ON DEMAND物化視圖的特性及其和ON COMMIT物化視圖的區別,即前者不刷新(手工或自動)就不更新物化視圖,而後者不刷新也會更新物化視圖,——只要基表發生了COMMIT。

    創建定時刷新的物化視圖:create materialized view mv_name refresh force on demand start with sysdate next sysdate+1 (指定物化視圖每天刷新一次)

     上述創建的物化視圖每天刷新,但是沒有指定刷新時間,如果要指定刷新時間(比如每天晚上10:00定時刷新一次):create materialized view mv_name refresh force on demand start with sysdate next to_date( concat( to_char( sysdate+1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss')
3、ON COMMIT物化視圖

     ON COMMIT物化視圖的創建,和上面創建ON DEMAND的物化視圖區別不大。因爲ON DEMAND是默認的,所以ON COMMIT物化視圖,需要再增加個參數即可。   需要注意的是,無法在定義時僅指定ON COMMIT,還得附帶個參數才行。

     創建ON COMMIT物化視圖:create materialized view mv_name refresh force on commit as select * from table_name    備註:實際創建過程中,基表需要有主鍵約束,否則會報錯(ORA-12014)

4、物化視圖的刷新

     刷新(Refresh):指當基表發生了DML操作後,物化視圖何時採用哪種方式和基表進行同步。刷新的模式有兩種:ON DEMAND和ON COMMIT。(如上所述)

     刷新的方法有四種:FAST、COMPLETE、FORCE和NEVER。FAST刷新採用增量刷新,只刷新自上次刷新以後進行的修改。COMPLETE刷新對整個物化視圖進行完全的刷新。如果選擇FORCE方式,則Oracle在刷新時會去判斷是否可以進行快速刷新,如果可以則採用FAST方式,否則採用COMPLETE的方式。NEVER指物化視圖不進行任何刷新。

      對於已經創建好的物化視圖,可以修改其刷新方式,比如把物化視圖mv_name的刷新方式修改爲每天晚上10點刷新一次:alter materialized view mv_name refresh force on demand start with sysdate next to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss')    
5、物化視圖具有表一樣的特徵,所以可以像對錶一樣,我們可以爲它創建索引,創建方法和對錶一樣。
6、物化視圖的刪除:

      雖然物化視圖是和表一起管理的,但是在經常使用的PLSQL工具中,並不能用刪除表的方式來刪除(在表上右鍵選擇‘drop’並不能刪除物化視圖),可以使用語句來實現:drop materialized view mv_name 

物化視圖創建參數

 (1)BUILD BUILD IMMEDIATE 是在創建物化視圖的時候就生成數據 BUILD DEFERRED 則在創建時不生成數據,以後根據需要再生成數據。 默認爲BUILD IMMEDIATE。
(2)REFRESH FAST 增量刷新用物化視圖日誌,來發送主表已經修改的數據行到物化視圖中。 COMPLETE 完全刷新重新生成整個視圖,如果請求完全刷新,oracle會完成完全刷新即使增量刷新可用。 FORCE 如果增量刷新可用Oracle將完成增量刷新,否則將完成完全刷新,如果不指定刷新方法(FAST, COMPLETE, or FORCE)。 默認選項是Force。
(3)ON ON DEMAND 指物化視圖在用戶需要的時候進行刷新。 ON COMMIT 指出物化視圖在對基表的DML操作提交的同時進行刷新。 默認是ON DEMAND.
(4)START WITH 通知數據庫完成從主表到本地表第一次複製的時間。
(5)NEXT 說明了刷新的時間間隔 根據下一次刷新的時間=上一次執行完成的時間+時間間隔。 爲了保證在用戶需要的時間點刷新,一般使用TRUNC()命令對時間取整到天數,然後加上時間。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章