概述
物化視圖是一種特殊的物理表,“物化”()視圖是相對普通視圖而言的。普通視圖是虛擬表,應(yīng)用的局限性大,任何對視圖的查詢,都實(shí)際上轉(zhuǎn)換為視圖SQL語句的查詢。這樣對整體查詢性能的提高,并沒有實(shí)質(zhì)上的好處。
1、物化視圖的創(chuàng)建
create materialized view [view_name] refresh [fast|complete|force] [ on [commit|demand] | start with (start_time) next (next_time) ] as {創(chuàng)建物化視圖用的查詢語句}
具體實(shí)例如下:
CREATE MATERIALIZED VIEW an_user_base_file_no_charge REFRESH COMPLETE START WITH SYSDATE NEXT TRUNC(SYSDATE+29)+5.5/24 --紅色部分表示從指定的時(shí)間開始,每隔一段時(shí)間(由next指定)就刷新一次 AS select distinct user_no from t
刪除物化視圖:
drop view ;
各參數(shù)的含義如下:
1. [fast||force] 視圖刷新的方式:
fast: 增量刷新.假設(shè)前一次刷新的時(shí)間為t1,那么使用fast模式刷新物化視圖時(shí),只向視圖中添加t1到當(dāng)前時(shí)間段內(nèi),主表變化過的數(shù)據(jù).為了記錄這種變化,建立增量刷新物化視圖還需要一個(gè)物化視圖日志表。 view log on (主表名)。
:全部刷新。相當(dāng)于重新執(zhí)行一次創(chuàng)建視圖的查詢語句。
force: 這是默認(rèn)的數(shù)據(jù)刷新方式。當(dāng)可以使用fast模式時(shí),數(shù)據(jù)刷新將采用fast方式;否則使用方式。
2.MV數(shù)據(jù)刷新的時(shí)間:
on :在用戶需要刷新的時(shí)候刷新,這里就要求用戶自己動(dòng)手去刷新數(shù)據(jù)了(也可以使用job定時(shí)刷新)
on :當(dāng)主表中有數(shù)據(jù)提交的時(shí)候,立即刷新MV中的數(shù)據(jù);
start ……:從指定的時(shí)間開始,每隔一段時(shí)間(由next指定)就刷新一次;
物化視圖的類型:ON 、ON
二者的區(qū)別在于刷新方法的不同,ON 顧名思義,僅在該物化視圖“需要”被刷新了,才進(jìn)行刷新(),即更新物化視圖,以保證和基表數(shù)據(jù)的一致性;而ON 是說,一旦基表有了,即事務(wù)提交,則立刻刷新,立刻更新物化視圖,使得數(shù)據(jù)和基表一致。
1、ON 物化視圖
物化視圖的創(chuàng)建本身是很復(fù)雜和需要優(yōu)化參數(shù)設(shè)置的,特別是針對大型生產(chǎn)數(shù)據(jù)庫系統(tǒng)而言。但允許以這種最簡單的,類似于普通視圖的方式來做,所以不可避免的會涉及到默認(rèn)值問題。也就是說給物化視圖的重要定義參數(shù)的默認(rèn)值處理是我們需要特別注意的。
物化視圖的特點(diǎn):
(1) 物化視圖在某種意義上說就是一個(gè)物理表(而且不僅僅是一個(gè)物理表),這通過其可以被查詢出來,而得到佐證;
(2) 物化視圖也是一種段(),所以其有自己的物理存儲屬性;
(3) 物化視圖會占用數(shù)據(jù)庫磁盤空間,這點(diǎn)從的查詢結(jié)果,可以得到佐證;
創(chuàng)建語句: view as * from 默認(rèn)情況下,如果沒指定刷新方法和刷新模式,則默認(rèn)為FORCE和。
物化視圖的數(shù)據(jù)怎么隨著基表而更新? 提供了兩種方式,手工刷新和自動(dòng)刷新,默認(rèn)為手工刷新。也就是說可更新的物化視圖,通過我們手工的執(zhí)行某個(gè)提供的系統(tǒng)級存儲過程或包,來保證物化視圖與基表數(shù)據(jù)一致性。這是最基本的刷新辦法了。自動(dòng)刷新,其實(shí)也就是會建立一個(gè)job,通過這個(gè)job來調(diào)用相同的存儲過程或包,加以實(shí)現(xiàn)。
ON 物化視圖的特性及其和ON 物化視圖的區(qū)別,即前者不刷新(手工或自動(dòng))就不更新物化視圖,而后者不刷新也會更新物化視圖,——只要基表發(fā)生了。
創(chuàng)建定時(shí)刷新的物化視圖: view force on start with next +1 (指定物化視圖每天刷新一次)
上述創(chuàng)建的物化視圖每天刷新,但是沒有指定刷新時(shí)間,如果要指定刷新時(shí)間(比如每天晚上10:00定時(shí)刷新一次): view force on start with next ( ( ( +1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss')
2、ON 物化視圖
ON 物化視圖的創(chuàng)建,和上面創(chuàng)建ON 的物化視圖區(qū)別不大。因?yàn)镺N 是默認(rèn)的,所以O(shè)N 物化視圖,需要再增加個(gè)參數(shù)即可。 需要注意的是,無法在定義時(shí)僅指定ON ,還得附帶個(gè)參數(shù)才行。
創(chuàng)建ON 物化視圖:
view force on as * from 備注:實(shí)際創(chuàng)建過程中,基表需要有主鍵約束,否則會報(bào)錯(cuò)(ORA-12014)
物化視圖的刷新
刷新():指當(dāng)基表發(fā)生了DML操作后,物化視圖何時(shí)采用哪種方式和基表進(jìn)行同步。刷新的模式有兩種:ON 和ON 。(如上所述)
刷新的方法有四種:FAST、、FORCE和NEVER。FAST刷新采用增量刷新,只刷新自上次刷新以后進(jìn)行的修改。刷新對整個(gè)物化視圖進(jìn)行完全的刷新。如果選擇FORCE方式,則在刷新時(shí)會去判斷是否可以進(jìn)行快速刷新可更新的物化視圖,如果可以則采用FAST方式,否則采用的方式。NEVER指物化視圖不進(jìn)行任何刷新。
對于已經(jīng)創(chuàng)建好的物化視圖,可以修改其刷新方式,比如把物化視圖的刷新方式修改為每天晚上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')
物化視圖建立索引
物化視圖具有表一樣的特征,所以可以像對表一樣,我們可以為它創(chuàng)建索引,創(chuàng)建方法和對表一樣。
1、物化視圖的索引的創(chuàng)建:
index on ign(id);
2、索引的查詢:
* FROM t where t.='NWPP.';
物化視圖是數(shù)據(jù)庫中的一種存儲數(shù)據(jù)的對象,和表一樣,存儲了數(shù)據(jù)。用于預(yù)先計(jì)算并保存表連接或者聚集等耗時(shí)較多的操作。這樣,在執(zhí)行查詢的時(shí)候,就可以避開連接、聚集等耗時(shí)的操作,從而快速的得到結(jié)果。在對數(shù)據(jù)庫存儲過程優(yōu)化時(shí)很多時(shí)候也是用物化視圖來做優(yōu)化,大家也可以研究下!后面會分享更多DBA方面的內(nèi)容,感興趣的朋友走一波關(guān)注哩~