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的查詢結果,可以得到佐證;

 

3、物化視圖的數據怎麼隨着基表而更新?
Oracle提供了兩種方式, 手工刷新和自動刷新,默認爲手工刷新 。也就是說,通過我們手工的執行某個Oracle提供的系統級存儲過程或包,來保證物化視圖與基表數據一致性。這是最基本的刷新辦法了。自動刷新,其實也就是Oracle會建立一個job,通過這個job來調用相同的存儲過程或包,加以實現。

 

4、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物化視圖,需要再增加個參數即可 。

需要注意的是,無法在定義時僅指定ON COMMIT,還得附帶個參數才行。
創建ON COMMIT物化視圖:

 


 

create materialized view mv_name refresh force on commit as select * from table_name

備註:實際創建過程中,基表需要有主鍵約束,否則會報錯(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

普通視圖的三個特徵:

1、是簡化設計,清晰編碼的東西, 他並不是提高性能的,他的存在只會降低性能(如一個視圖7個表關聯,另一個視圖8個表,程序員不知道,覺得很方便,把兩個視圖關聯再做 一個視圖,那就慘了),他的存在未了在設計上的方便性

2、其次,是安全,在授權給其他用戶或者查看角度,多個表關聯只允許查看,不允許修改,單表也可以同WITH READ ONLY來控制,當然 有些項目基於視圖做面向對象的開發,即在視圖上去做INSTAND OF觸發器,雖然開發上方便,但是未必是好事。

3、從不同的角度看不同的維度,視圖可以劃分維度和權限,並使多個維度的綜合,也就是你要什麼就可以從不同的角度看,而表是一個實體 的而已,一般維度較少(如:人員表和身份表關聯,從人員表可以查看人員的維度統計,從身份看,可以看不同種類的身份有那些人或者多少 人),其次另一個如系統視圖USER_TABLE、TAB、USER_OBJECTS這些視圖,不同的用戶下看到的肯定是不一樣的,看的是自己的東西。

物化視圖呢 ,用於OLAP系統中,當然部分OLTP系統的小部分功能未了提高性能會借鑑一點點,因爲表關聯的開銷很大,所以在開發中很多人就 像把這個代價交給定期轉存來完成,ORACLE當然也提供了這個功能,就是將視圖(或者一個大SQL)的信息轉換爲物理數據存儲,然後提供 不同的策略:定時刷還是及時刷、增量刷還是全局刷等等可以根據實際情況進行選擇,總之你查的是表,不是視圖。

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