物化視圖詳解
物化視圖是包括一個(gè)查詢結(jié)果的數(shù)據(jù)庫對(duì)象,它是遠(yuǎn)程數(shù)據(jù)的的本地副本,或者用來生成基于數(shù)據(jù)表求和的匯總表。物化視圖存儲(chǔ)基于遠(yuǎn)程表的數(shù)據(jù),也可以稱為快照。對(duì)于復(fù)制,物化視圖允許你在本地維護(hù)遠(yuǎn)程數(shù)據(jù)的副本,這些副本是只讀的。如果你想修改本地副本,必須用高級(jí)復(fù)制的功能。當(dāng)你想從一個(gè)表或視圖中抽取數(shù)據(jù)時(shí),你可以用從物化視圖中抽取。 對(duì)于數(shù)據(jù)倉庫,創(chuàng)建的物化視圖通常情況下是聚合視圖,單一表聚合視圖和連接視圖。物化視圖可以查詢表,視圖和其它的物化視圖。
一、 關(guān)于物化視圖日志:
查詢物化視圖日志文件格式:desc mlog$_lzwmvtest;
創(chuàng)建物化視圖時(shí)默認(rèn)指定物化視圖中存在主鍵,如果不指定,那么創(chuàng)建的物化視圖日志文件的基表必須存在主鍵,否則會(huì)報(bào)錯(cuò)
Demo:對(duì)一個(gè)表test
創(chuàng)建日志:creatematerialized view log on test;
那么會(huì)報(bào):表'LZWMVTEST'不包含主鍵約束條件
這種情況下,就必須指定日志文件結(jié)構(gòu)
比如:creatematerialized view log on test with rowid(具體的針對(duì)日志內(nèi)容方面的在另外一個(gè)專題里說明,這里就簡(jiǎn)述到此)
二、 關(guān)于生成數(shù)據(jù)和刷新:
1>生成數(shù)據(jù)
兩大選項(xiàng):buildimmediate build deferred
Build immediate:在創(chuàng)建物化視圖的同時(shí)根據(jù)主表生成數(shù)據(jù)
Bulid deferred:在創(chuàng)建物化視圖的同時(shí),在物化視圖內(nèi)不生成數(shù)據(jù),如果此時(shí)沒有生成數(shù)據(jù),以后可以采取:EXECDBMS_MVIEW.Refresh(‘MV_name’,’C’),注意必須使用全量刷新,默認(rèn)是增量刷新,所以這里參數(shù)必須是C,因?yàn)橹岸紱]有生成數(shù)據(jù),所以必須全量。
2>關(guān)于刷新
² 刷新方式:completefast force
Complete:完全刷新整個(gè)物化視圖,相當(dāng)于重新生成物化視圖,此時(shí)即時(shí)增量刷新可用也全量刷新
Ø Fast:當(dāng)有數(shù)據(jù)更新時(shí)依照相應(yīng)的規(guī)則對(duì)物化視圖進(jìn)行更新(此時(shí)必須創(chuàng)建物化視圖日志(物化視圖日志記錄了數(shù)據(jù)更新的日志),關(guān)于日志的說明,參照“物化視圖日志文件介紹”)
Ø Force:當(dāng)增量刷新可用則增量刷新,當(dāng)增量刷新不可用,則全量刷新(此項(xiàng)為默認(rèn)選項(xiàng))
不過從實(shí)際情況出發(fā),應(yīng)該盡量不使用默認(rèn)選項(xiàng),可以考慮使用增量刷新,對(duì)大表特別有效,大表全量更新速度是非常慢的,特別是在存在索引的情況下(在創(chuàng)建物化視圖語句中,可能某些限制查詢的條件,導(dǎo)致了增量刷新無法使用,這個(gè)是需要注意的,具體是哪類語句導(dǎo)致fast刷新不可用,有待總結(jié)…..)
² 刷新時(shí)間:ondemand on commit start with/ next
On demand:在需要刷新時(shí)進(jìn)行刷新(人工判斷)
On commit:在基表上有提交操作時(shí),進(jìn)行更新
Start with:指定首次刷新的時(shí)間(一般指定的是當(dāng)前時(shí)間,不過也可以在創(chuàng)建物化視圖時(shí)不生成數(shù)據(jù),則可以考慮在指定的時(shí)間刷新,從而生成數(shù)據(jù))
Next:刷新的周期時(shí)間
三、 基于主鍵的物化視圖和ROWID的物化視圖的說明
創(chuàng)建物化視圖日志時(shí),指定了記錄更新的原則即with 后面的primary 或者rowid或者object id等等,后面,默認(rèn)是以primary key為記錄更新,在物化視圖內(nèi)也是以此為更新的原則。
例如:1、如果日志內(nèi)使用的是primary key 則在創(chuàng)建物化視圖時(shí)指定rowid來更新,則會(huì)報(bào)ORA-12032: 不能使用 "TEST" 上實(shí)體化視圖日志中的 rowid 列
2、如過日志內(nèi)使用的是rowid 則在創(chuàng)建物化視圖時(shí)指定primary或者默認(rèn)指定,則會(huì)報(bào)ORA-23415: "GIS"."LZWMV" 的實(shí)體化視圖日志不記錄主鍵
四、 關(guān)于物化視圖存放的的表空間
直接在創(chuàng)建物化視圖時(shí)指定日志存放的表空間和物化視圖的表空間。
例子:create materialized view MV_TESTtablespace test ----表空間名稱
五、 關(guān)于查詢重寫和更新
在創(chuàng)建查詢重寫時(shí),基表中必須有主鍵約束,視圖里是無法創(chuàng)建主鍵的,不過其繼承了基表的主鍵約束。(關(guān)于視圖的創(chuàng)建的一些技巧有待總結(jié)……)下面給個(gè)例子
Creatematerialized view MV_TEST
Refreshfast ----前提是必須創(chuàng)建基表日志,可以忽略該項(xiàng)
Enablequery rewrite ----前提是基表上必須存在主鍵約束
As
Select* from TEST; ----物化視圖數(shù)據(jù)生成
六、 關(guān)于創(chuàng)建物化視圖的例子:
1、 使用增量刷新的物化視圖的寫法
創(chuàng)建物化視圖日志,必須創(chuàng)建日志
Create materialized viewlog on TEST ----TEST為表名
----注:(TEST為表名或者視圖名,關(guān)于視圖上建立物化視圖,見基于視圖的物化視圖
----創(chuàng)建物化視圖語句:
Create materialized viewMV_TEST
----MVTEST為物化視圖名
Build immediate
----創(chuàng)建時(shí)生成數(shù)據(jù)對(duì)應(yīng)的是builddeferred
Refresh fast
----增量刷新
On commit
----在基表有更新時(shí)提交,這里該句對(duì)視圖無效
With rowid
----這里創(chuàng)建基于rowid的物化視圖,對(duì)應(yīng)的是 primary key
As
Select * from TEST;
----生成物化視圖數(shù)據(jù)語句
七、 小的知識(shí)點(diǎn)
創(chuàng)建主鍵約束語句:alter table table_name add(constraintconstraint_name primary key(columes));
建議使用job來定期刷新物化視圖聯(lián)系客服