1. 程式人生 > >ORACLE物化檢視與檢視區別

ORACLE物化檢視與檢視區別

 物化檢視是一種特殊的物理表,“物化”(Materialized)檢視是相對普通檢視而言的。普通檢視是虛擬表,應用的侷限性大,任何對檢視的查詢,Oracle都實際上轉換為檢視SQL語句的查詢。這樣對整體查詢效能的提高,並沒有實質上的好。
    物化檢視:是包括一個查詢結果的資料庫對像,它是遠端資料的的本地副本,或者用來生成基於資料表求和的彙總表。物化檢視儲存基於遠端表的資料,也可以稱為快照!
    1.物化檢視的型別:ON DEMAND、ON COMMIT 
    二者的區別在於重新整理方法的不同,ON DEMAND顧名思義,僅在該物化檢視“需要”被重新整理了,才進行重新整理(REFRESH),即更新物化檢視,以保證和基表資料的一致性;而ON COMMIT是說,一旦基表有了COMMIT,即事務提交,則立刻重新整理,立刻更新物化檢視,使得資料和基表一致
    2、ON DEMAND物化檢視:物化檢視的建立本身是很複雜和需要優化引數設定的,特別是針對大型生產資料庫系統而言。但Oracle允許以這種最簡單的,類似於普通檢視的方式來做,所以不可避免的會涉及到預設值問題。也就是說Oracle給物化檢視的重要定義引數的預設值處理是我們需要特別注意的。
    3.物化檢視的特點:    
     (1) 物化檢視在某種意義上說就是一個物理表(而且不僅僅是一個物理表),這通過其可以被user_tables查詢出來,而得到佐證;    
     (2) 物化檢視也是一種段(segment),所以其有自己的物理儲存屬性;    
     (3) 物化檢視會佔用資料庫磁碟空間,這點從user_segment的查詢結果,可以得到佐證;    
     建立語句:create materialized view mv_name as select * from table_name    
     預設情況下,如果沒指定重新整理方法和重新整理模式,則Oracle預設為FORCE和DEMAND。
    4.物化檢視的資料怎麼隨著基表而更新?    
     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')
    5、ON COMMIT物化檢視    
       ON COMMIT物化檢視的建立,和上面建立ON DEMAND的物化檢視區別不大。因為ON DEMAND是預設的,所以ON COMMIT物化檢視,需要再增加個引數即可
       需要注意的是,實際建立過程中,基表需要有主鍵約束,否則會報錯(ORA-12014)

    6、物化檢視的重新整理    
       重新整理(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')
    7、物化檢視具有表一樣的特徵,所以可以像對錶一樣,我們可以為它建立索引,建立方法和對錶
    8、物化檢視的刪除:     
       雖然物化檢視是和表一起管理的,但是在經常使用的PLSQL工具中,並不能用刪除表的方式來刪除(在表上右鍵選擇‘drop’並不能刪除物化檢視),可以使用語句來實現:drop materialized view mv_name