物化视图VS普通视图
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
?物化視圖是一種特殊的物理表,“物化”(Materialized)視圖是相對(duì)普通視圖而言的。普通視圖是虛擬表,應(yīng)用的局限性大,任何對(duì)視圖的查詢,Oracle都實(shí)際上轉(zhuǎn)換為視圖SQL語(yǔ)句的查詢。這樣對(duì)整體查詢性能的提高,并沒(méi)有實(shí)質(zhì)上的好處。
1、物化視圖的類型:ON DEMAND、ON COMMIT
?? ?二者的區(qū)別在于刷新方法的不同,ON DEMAND顧名思義,僅在該物化視圖“需要”被刷新了,才進(jìn)行刷新(REFRESH),即更新物化視圖,以保證和基表數(shù)據(jù)的一致性;而ON COMMIT是說(shuō),一旦基表有了COMMIT,即事務(wù)提交,則立刻刷新,立刻更新物化視圖,使得數(shù)據(jù)和基表一致。
2、ON DEMAND物化視圖
?? ?物化視圖的創(chuàng)建本身是很復(fù)雜和需要優(yōu)化參數(shù)設(shè)置的,特別是針對(duì)大型生產(chǎn)數(shù)據(jù)庫(kù)系統(tǒng)而言。但Oracle允許以這種最簡(jiǎn)單的,類似于普通視圖的方式來(lái)做, 所以不可避免的會(huì)涉及到默認(rèn)值問(wèn)題。也就是說(shuō)Oracle給物化視圖的重要定義參數(shù)的默認(rèn)值處理是我們需要特別注意的。
?? ?物化視圖的特點(diǎn):
?? ?(1) 物化視圖在某種意義上說(shuō)就是一個(gè)物理表(而且不僅僅是一個(gè)物理表),這通過(guò)其可以被user_tables查詢出來(lái),而得到佐證;
?? ?(2) 物化視圖也是一種段(segment),所以其有自己的物理存儲(chǔ)屬性;
?? ?(3) 物化視圖會(huì)占用數(shù)據(jù)庫(kù)磁盤空間,這點(diǎn)從user_segment的查詢結(jié)果,可以得到佐證;
?? ?創(chuàng)建語(yǔ)句:create materialized view mv_name as select * from table_name
?? ?默認(rèn)情況下,如果沒(méi)指定刷新方法和刷新模式,則Oracle默認(rèn)為FORCE和DEMAND。
?? ?物化視圖的數(shù)據(jù)怎么隨著基表而更新?
?? ?Oracle提供了兩種方式,手工刷新和自動(dòng)刷新,默認(rèn)為手工刷新。也就是說(shuō),通過(guò)我們手工的執(zhí)行某個(gè)Oracle提供的系統(tǒng)級(jí)存儲(chǔ)過(guò)程或包,來(lái)保證物 化視圖與基表數(shù)據(jù)一致性。這是最基本的刷新辦法了。自動(dòng)刷新,其實(shí)也就是Oracle會(huì)建立一個(gè)job,通過(guò)這個(gè)job來(lái)調(diào)用相同的存儲(chǔ)過(guò)程或包,加以實(shí) 現(xiàn)。
?? ?
?? ?ON DEMAND物化視圖的特性及其和ON COMMIT物化視圖的區(qū)別,即前者不刷新(手工或自動(dòng))就不更新物化視圖,而后者不刷新也會(huì)更新物化視圖,——只要基表發(fā)生了COMMIT。
??? 創(chuàng)建定時(shí)刷新的物化視圖:create materialized view mv_name refresh force on demand start with sysdate
next sysdate+1 (指定物化視圖每天刷新一次)
??? 上述創(chuàng)建的物化視圖每天刷新,但是沒(méi)有指定刷新時(shí)間,如果要指定刷新時(shí)間(比如每天晚上10:00定時(shí)刷新一次):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物化視圖的創(chuàng)建,和上面創(chuàng)建ON DEMAND的物化視圖區(qū)別不大。因?yàn)镺N DEMAND是默認(rèn)的,所以O(shè)N COMMIT物化視圖,需要再增加個(gè)參數(shù)即可。
?? ?需要注意的是,無(wú)法在定義時(shí)僅指定ON COMMIT,還得附帶個(gè)參數(shù)才行。
?? ?創(chuàng)建ON COMMIT物化視圖:create materialized view mv_name refresh force on commit as select * from table_name
?? ?備注:實(shí)際創(chuàng)建過(guò)程中,基表需要有主鍵約束,否則會(huì)報(bào)錯(cuò)(ORA-12014)
4、物化視圖的刷新
??? 刷新(Refresh):指當(dāng)基表發(fā)生了DML操作后,物化視圖何時(shí)采用哪種方式和基表進(jìn)行同步。刷新的模式有兩種:ON DEMAND和ON COMMIT。(如上所述)
??? 刷新的方法有四種:FAST、COMPLETE、FORCE和NEVER。FAST刷新采用增量刷新,只刷新自上次刷新以后進(jìn)行的修改。COMPLETE 刷新對(duì)整個(gè)物化視圖進(jìn)行完全的刷新。如果選擇FORCE方式,則Oracle在刷新時(shí)會(huì)去判斷是否可以進(jìn)行快速刷新,如果可以則采用FAST方式,否則采 用COMPLETE的方式。NEVER指物化視圖不進(jìn)行任何刷新。
???? 對(duì)于已經(jīng)創(chuàng)建好的物化視圖,可以修改其刷新方式,比如把物化視圖mv_name的刷新方式修改為每天晚上10點(diǎn)刷新一次: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、物化視圖具有表一樣的特征,所以可以像對(duì)表一樣,我們可以為它創(chuàng)建索引,創(chuàng)建方法和對(duì)表一樣。
6、物化視圖的刪除:
???? 雖然物化視圖是和表一起管理的,但是在經(jīng)常使用的PLSQL工具中,并不能用刪除表的方式來(lái)刪除(在表上右鍵選擇‘drop’并不能刪除物化視圖),可以使用語(yǔ)句來(lái)實(shí)現(xiàn):drop materialized view mv_name
?
?
普通視圖和物化視圖的區(qū)別
答曰:普 通視圖和物化視圖根本就不是一個(gè)東西,說(shuō)區(qū)別都是硬拼到一起的,首先明白基本概念,普通視圖是不存儲(chǔ)任何數(shù)據(jù)的,他只有定義,在查詢中是轉(zhuǎn)換為對(duì)應(yīng)的定義 SQL去查詢,而物化視圖是將數(shù)據(jù)轉(zhuǎn)換為一個(gè)表,實(shí)際存儲(chǔ)著數(shù)據(jù),這樣查詢數(shù)據(jù),就不用關(guān)聯(lián)一大堆表,如果表很大的話,會(huì)在臨時(shí)表空間內(nèi)做大量的操作。
普通視圖的三個(gè)特征:
1、是簡(jiǎn)化設(shè)計(jì),清晰編碼的東西,他并不是提高性能的,他的存在只會(huì)降低性能(如一個(gè)視圖7個(gè)表關(guān)聯(lián),另一個(gè)視圖8個(gè)表,程序員不知道,覺(jué)得很方便,把兩個(gè)視圖關(guān)聯(lián)再做一個(gè)視圖,那就慘了),他的存在未了在設(shè)計(jì)上的方便性
2、其次,是安全,在授權(quán)給其他用戶或者查看角度,多個(gè)表關(guān)聯(lián)只允許查看,不允許修改,單表也可以同WITH READ ONLY來(lái)控制,當(dāng)然有些項(xiàng)目基于視圖做面向?qū)ο蟮拈_發(fā),即在視圖上去做INSTAND OF觸發(fā)器,就我個(gè)人而言是不站同的,雖然開發(fā)上方便,但是未必是好事。
3、從不同的角度看不同的維度, 視圖可以劃分維度和權(quán)限,并使多個(gè)維度的綜合,也就是你要什么就可以從不同的角度看,而表是一個(gè)實(shí)體的而已,一般維度較少(如:人員表和身份表關(guān)聯(lián),從人 員表可以查看人員的維度統(tǒng)計(jì),從身份看,可以看不同種類的身份有那些人或者多少人),其次另一個(gè)如系統(tǒng)視圖USER_TABLE、TAB、 USER_OBJECTS這些視圖,不同的用戶下看到的肯定是不一樣的,看的是自己的東西。
物化視圖呢,用于OLAP系統(tǒng)中,當(dāng)然部分 OLTP系統(tǒng)的小部分功能未了提高性能會(huì)借鑒一點(diǎn)點(diǎn),因?yàn)楸黻P(guān)聯(lián)的開銷很大,所以在開發(fā)中很多人就像把這個(gè)代價(jià)交給定期轉(zhuǎn)存來(lái)完成,ORACLE當(dāng)然也提 供了這個(gè)功能,就是將視圖(或者一個(gè)大SQL)的信息轉(zhuǎn)換為物理數(shù)據(jù)存儲(chǔ),然后提供不同的策略:定時(shí)刷還是及時(shí)刷、增量刷還是全局刷等等可以根據(jù)實(shí)際情況 進(jìn)行選擇,總之你差的是表,不是視圖。
關(guān)于在刷新和索引上的區(qū)別
答曰:他 們兩個(gè)沒(méi)有聯(lián)系吧,刷新我不清楚你是否指的是物化視圖的刷新,因?yàn)樗⑿碌母拍詈芊?#xff0c;你說(shuō)到這里我就理解為物化視圖的刷新了,上面也已經(jīng)說(shuō)了,這是一種策略 和方法,其實(shí)它是通過(guò)對(duì)視圖關(guān)聯(lián)表上創(chuàng)建相應(yīng)的LOG,根據(jù)日志信息的SQL同步到物化視圖中的,一般來(lái)說(shuō):定時(shí)的一般是全局刷,及時(shí)的一般是局部刷。
而索引這個(gè)說(shuō)起來(lái)就多了,可以說(shuō)索引專門是一門課程,大概點(diǎn)來(lái)說(shuō),索引一般有普通索引、位圖索引、唯一性索引(還有全文索引啥的,一般不用),其實(shí)仔細(xì)研究會(huì)發(fā)現(xiàn)無(wú)論是那一種索引都是B+樹為基礎(chǔ),并起存放方式和表一樣,是以段為單位,只是內(nèi)部有樹關(guān)系而已。
1、普通索引是根據(jù)B+樹找到第一個(gè)(索引時(shí)有序的),然后以當(dāng)前為基準(zhǔn),向后順序找到不符合條件的健值為止。
2、位圖是在葉子節(jié)點(diǎn)上根據(jù)位圖種類對(duì)葉子節(jié)點(diǎn)的值進(jìn)行01編碼存放(如該字段有1、2、3三種值,就會(huì)在葉子節(jié)點(diǎn)上有三個(gè)位圖,每個(gè)位圖根據(jù)健值和ROWID順序存放是否為1、是否為2、是否為3,所以在RBO下統(tǒng)計(jì)很快,CBO下一般會(huì)認(rèn)為是普通索引)。
3、也是按照B+樹找,只是找到就不再做任何操作,因?yàn)槭俏ㄒ坏摹?br />
因 為B+查找是一個(gè)類似表的查詢,而且獲取到ROWID后還是要回表查詢的,所以這個(gè)過(guò)程的開銷要和全表掃描計(jì)算那個(gè)結(jié)果更加快,ORACLE才會(huì)選擇是走 索引還是走全表掃描,當(dāng)然對(duì)于CBO和RBO選擇的方式不一樣,具體又是很多,CBO要依賴于表的統(tǒng)計(jì)信息,RBO是依賴于嘗試。
轉(zhuǎn)載于:https://my.oschina.net/u/264186/blog/638110
總結(jié)
以上是生活随笔為你收集整理的物化视图VS普通视图的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python 网络编程----非阻塞或异
- 下一篇: iOS c语言 基本运算符