普通視圖和物化視圖的區別

物化視圖是一種特殊的物理表,「物化」(Materialized)視圖是相對普通視圖而言的。
普通視圖是虛擬表,應用的侷限性大,任何對視圖的查詢,Oracle都實際上轉換爲視圖SQL語句的查詢。這樣對總體查詢性能的提升,並無實質上的好處。程序員


一、物化視圖的類型:數據庫

ON DEMAND、ON COMMIT 兩者的區別在於刷新方法的不一樣
ON DEMAND顧名思義,僅在該物化視圖「須要」被刷新了,才進行刷新(REFRESH),即更新物化視圖,以保證和基表數據的一致性;
而ON COMMIT是說,一旦基表有了COMMIT,即事務提交,則馬上刷新,馬上更新物化視圖,使得數據和基表一致。安全

二、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')編碼


三、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)設計

 

四、物化視圖的刷新
刷新(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')日誌

 

五、物化視圖具備表同樣的特徵對象

因此能夠像對錶同樣,咱們能夠爲它建立索引,建立方法和對錶同樣。

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

 

普通視圖和物化視圖的區別
普通視圖和物化視圖根本就不是一個東西,說區別都是硬拼到一塊兒的,
首先明白基本概念,普通視圖是不存儲任何數據的,他只有定義,在查詢中是轉換爲對應的定義SQL去查詢,
而物化視圖是將數據轉換爲一個表,實際存儲着數據,這樣查詢數據,就不用關聯一大堆表,若是表很大的話,會在臨時表空間內作大量的操做。

普通視圖的三個特徵:
一、是簡化設計,清晰編碼的東西,他並非提升性能的,他的存在只會下降性能
(如一個視圖7個表關聯,另外一個視圖8個表,程序員不知道,以爲很方便,把兩個視圖關聯再作一個視圖,那就慘了),他的存在未了在設計上的方便性

二、其次,是安全,在受權給其餘用戶或者查看角度,多個表關聯只容許查看,不容許修改,
單表也能夠同WITH READ ONLY來控制,固然有些項目基於視圖作面向對象的開發,即在視圖上去作INSTAND OF觸發器,就我我的而言是不站同的,雖然開發上方便,可是未必是好事。

三、從不一樣的角度看不一樣的維度,視圖能夠劃分維度和權限,並使多個維度的綜合,也就是你要什麼就能夠從不一樣的角度看,而表是一個實體的而已,
通常維度較少(如:人員表和身份表關聯,從人員表能夠查看人員的維度統計,從身份看,能夠看不一樣種類的身份有那些人或者多少人),
其次另外一個如系統視圖USER_TABLE、TAB、USER_OBJECTS這些視圖,不一樣的用戶下看到的確定是不同的,看的是本身的東西。
物化視圖呢,用於OLAP系統中,固然部分OLTP系統的小部分功能未了提升性能會借鑑一點點,由於表關聯的開銷很大,因此在開發中不少人就像把這個代價交給按期轉存來完成,
ORACLE固然也提供了這個功能,就是將視圖(或者一個大SQL)的信息轉換爲物理數據存儲,而後提供不一樣的策略:
定時刷仍是及時刷、增量刷仍是全局刷等等能夠根據實際狀況進行選擇,總之你差的是表,不是視圖。


關於在刷新和索引上的區別
他們兩個沒有聯繫吧,刷新我不清楚你是否指的是物化視圖的刷新,由於刷新的概念很泛,你說到這裏我就理解爲物化視圖的刷新了,
上面也已經說了,這是一種策略和方法,其實它是經過對視圖關聯表上建立相應的LOG,根據日誌信息的SQL同步到物化視圖中的,
通常來講:定時的通常是全局刷,及時的通常是局部刷。

而索引這個提及來就多了,能夠說索引專門是一門課程,大概點來講,索引通常有普通索引、位圖索引、惟一性索引(還有全文索引啥的,通常不用),
其實仔細研究會發現不管是那一種索引都是B+樹爲基礎,並起存放方式和表同樣,是以段爲單位,只是內部有樹關係而已。

一、普通索引是根據B+樹找到第一個(索引時有序的),而後以當前爲基準,向後順序找到不符合條件的健值爲止。
二、位圖是在葉子節點上根據位圖種類對葉子節點的值進行01編碼存放(如該字段有一、二、3三種值,就會在葉子節點上有三個位圖,
每一個位圖根據健值和ROWID順序存放是否爲一、是否爲二、是否爲3,因此在RBO下統計很快,CBO下通常會認爲是普通索引)。

三、也是按照B+樹找,只是找到就再也不作任何操做,由於是惟一的。由於B+查找是一個相似表的查詢,並且獲取到ROWID後仍是要回表查詢的,因此這個過程的開銷要和全表掃描計算那個結果更加快,ORACLE纔會選擇是走索引仍是走全表掃描,固然對於CBO和RBO選擇的方式不同,具體又是不少,CBO要依賴於表的統計信息,RBO是依賴於嘗試。

相關文章
相關標籤/搜索