oracle物化視圖
物化視圖對(duì)于前臺(tái)數(shù)據(jù)庫(kù)使用者來(lái)說(shuō)如同一個(gè)實(shí)際的表,具有和一般表相通的如select等操作,而其實(shí)際上是一個(gè)視圖,一個(gè)由系統(tǒng)實(shí)現(xiàn)定期刷新其數(shù)據(jù)的視圖(具體刷新時(shí)間在定義物化視圖的時(shí)候已有定義),使用物化視圖更可以實(shí)現(xiàn)視圖的所有功能,而物化視圖確不是在使用時(shí)才讀取,大大提高了讀取速度,特別適用抽取大數(shù)據(jù)量表某些信息以及數(shù)據(jù)鏈連接表使用.具體語(yǔ)法如下:
物化視圖對(duì)于前臺(tái)數(shù)據(jù)庫(kù)使用者來(lái)說(shuō)如同一個(gè)實(shí)際的表,具有和表相通的一般select操作,而其實(shí)際上是一個(gè)視圖,一個(gè)定期刷新數(shù)據(jù)的視圖(具體刷新時(shí)間在定義物化視圖的時(shí)候已有定義),使用物化視圖可以實(shí)現(xiàn)視圖的所有功能,而物化視圖確不是在使用時(shí)才讀取,大大提高了讀取速度,特別適用抽取大數(shù)據(jù)量表某些信息以及數(shù)據(jù)鏈連接表使用.具體語(yǔ)法如下:
CREATE MATERIALIZED VIEW an_user_base_file_no_charge
REFRESH COMPLETE START WITH SYSDATE
NEXT TRUNC(SYSDATE+29)+5.5/24
as
select distinct user_no
from cw_arrearage t
where (t.mon = dbms_tianjin.getLastMonth or
t.mon = add_months(dbms_tianjin.getLastMonth, -1))
drop materialized view an_user_base_file_no_charge;
第 13 章 物化視圖
8.1.5企業(yè)版/個(gè)人版開(kāi)始支持
需要權(quán)限:GRANT CREATE MATERIALIZED VIEW,還必須直接賦予GRANT QUERY REWRITE.為實(shí)現(xiàn)查詢重寫,必須使用CBO.
13.1 物化視圖如何工作
設(shè)置
COMPATIBLE參數(shù)必須高于8.1.0
QUERY_REWRITE_ENABLED = TRUE
QUERY_REWRITE_INTEGRETY =
ENFORCED - 查詢僅用Oracle強(qiáng)制與保證的約束、規(guī)則重寫;
TRUSTED – 查詢除用Oracle強(qiáng)制與保證的約束、規(guī)則,也可用用戶設(shè)定的數(shù)據(jù)間的任何關(guān)系來(lái)重寫;
STALE_TOLERATED – 即便Oracle知道物化視圖中數(shù)據(jù)過(guò)期(與事實(shí)表等不同步),也重寫查詢。
創(chuàng)建物化視圖的用戶必須具有直接賦予的GRANT QUERY REWRITE權(quán)限,不能通過(guò)角色繼承。
內(nèi)部機(jī)制
全文匹配
部分匹配:從FROM子句開(kāi)始,優(yōu)化器比較之后的文本,然后比較SELECT列表
一般重寫方法:
數(shù)據(jù)充分
關(guān)聯(lián)兼容
分組兼容
聚集兼容
13.2 確保使用物化視圖
約束
考慮到現(xiàn)實(shí)環(huán)境的數(shù)據(jù)量,可以將主鍵、外鍵、非空等約束置為NOVALIDATE,并調(diào)整QUERY_REWRITE_INTEGRITY為TRUSTED,這樣可以達(dá)到“欺騙”數(shù)據(jù)庫(kù)的目的,但必須注意如果無(wú)法保證此類約束的真實(shí)有效,查詢改寫后可能造成結(jié)果不精確。
維度
實(shí)際就是指明已存在的表中各列的歸并關(guān)系,從而關(guān)聯(lián)事實(shí)表后形成的物化視圖可用于向“上”歸并(相當(dāng)于用表中代表更高歸并關(guān)系的列關(guān)聯(lián)事實(shí)表)。標(biāo)準(zhǔn)語(yǔ)法:
CREATE DIMENSION time_hierarchy_dim
LEVEL day IS time_hierarchy.day
LEVEL mmyyyy IS time_hierarchy.mmyyyy
LEVEL yyyy IS time_hierarchy.yyyy
HIERARCHY time_rollup
(day CHILD OF mmyyyy CHILD OF yyyy)
ATTRIBUTE mmyyyy
DETERMINES mon_yyyy;
13.3 DBMS_OLAP
估計(jì)(物化視圖)大小
DBMS_OLAP.ESTIMATE_SUMMARY_SIZE(視圖名, 視圖定義, 估計(jì)行數(shù), 估計(jì)字節(jié)數(shù));
其中后兩個(gè)參數(shù)為NUMBER型輸出參數(shù)。
維度有效性檢查
DBMS_OLAP.VALIDATE_DIMENSION(視圖名, 用戶名, FALSE, FALSE);
SELECT * FROM 維度表名
WHERE ROWIN IN (SEELCT bad_rowid FROM MVIEW$_EXCEPTION);
所選出行即為不符合維度定義的行。
推薦物化視圖
首先必須添加合適的外鍵,包通過(guò)外鍵來(lái)判定表之間的關(guān)系而不是維度。
DBMS_OLAP.RECOMMEND_MV(事實(shí)表名, 1000000000, ‘’);
第二個(gè)參數(shù)表示物化視圖可用的空間大小,可傳入一個(gè)較大的數(shù)。第三個(gè)參數(shù)傳入需要保留的特定物化視圖,傳入空即為不考慮其他物化視圖。
執(zhí)行C:\oracle\RDBMS\demo\sadvdemo后執(zhí)行:
DEMO_SUMADV.PRETTYPRINT_RECOMMENDATIONS
13.4 最后說(shuō)明
物化視圖不為OLTP系統(tǒng)設(shè)計(jì)
在事實(shí)表等更新時(shí)會(huì)導(dǎo)致物化視圖行鎖,從而影響系統(tǒng)并發(fā)性。