首頁(yè)技術(shù)文章正文

oracle物化視圖:創(chuàng)建物化視圖語(yǔ)法

更新時(shí)間:2021-08-20 來(lái)源:黑馬程序員 瀏覽量:

加QQ:435946716獲取Orcale視頻全套【筆記+教程】


1.什么是物化視圖?

視圖是一個(gè)虛擬表(也可以認(rèn)為是一條語(yǔ)句),基于它創(chuàng)建時(shí)指定的查詢語(yǔ)句返回的結(jié)果集。每次訪問(wèn)它都會(huì)導(dǎo)致這個(gè)查詢語(yǔ)句被執(zhí)行一次。為了避免每次訪問(wèn)都執(zhí)行這個(gè)查詢,可以將這個(gè)查詢結(jié)果集存儲(chǔ)到一個(gè)物化視圖(也叫實(shí)體化視圖)。

物化視圖與普通的視圖相比的區(qū)別是物化視圖是建立的副本,它類(lèi)似于一張表,需要占用存儲(chǔ)空間。而對(duì)一個(gè)物化視圖查詢的執(zhí)行效率與查詢一個(gè)表是一樣的。


2.創(chuàng)建物化視圖語(yǔ)法

CREATE METERIALIZED VIEW view_name
[BUILD IMMEDIATE | BUILD DEFERRED ]
REFRESH [FAST|COMPLETE|FORCE] [
ON [COMMIT |DEMAND ] | START WITH (start_time) NEXT
(next_time)
]
AS
subquery

BUILD IMMEDIATE 是在創(chuàng)建物化視圖的時(shí)候就生成數(shù)據(jù)

BUILD DEFERRED 則在創(chuàng)建時(shí)不生成數(shù)據(jù),以后根據(jù)需要再生成數(shù)據(jù)。

默認(rèn)為 BUILD IMMEDIATE。

刷新(REFRESH):指當(dāng)基表發(fā)生了 DML 操作后,物化視圖何時(shí)采用哪種方式和基表進(jìn)行同步。

REFRESH 后跟著指定的刷新方法有三種:FAST、COMPLETE、FORCE。FAST刷新采用增量刷新,只刷新自上次刷新以后進(jìn)行的修改。COMPLETE刷新對(duì)整個(gè)物化視圖進(jìn)行完全的刷新。如果選擇 FORCE 方式,則 Oracle 在刷新時(shí)會(huì)去判斷是否可以進(jìn)行快速刷新,如果可以則采用FAST方式,否則采用COMPLETE的方式。FORCE 是默認(rèn)的方式。

刷新的模式有兩種:ON DEMAND 和 ON COMMIT。ON DEMAND 指需要手動(dòng)刷新物化視圖(默認(rèn))。ON COMMIT 指在基表發(fā)生COMMIT操作時(shí)自動(dòng)刷新。


3.案例


3.1 創(chuàng)建手動(dòng)刷新的物化視圖

需求:查詢地址 ID,地址名稱和所屬區(qū)域名稱, 結(jié)果如下:

什么是物化視圖

語(yǔ)句:

create materialized view mv_address 
as
select ad.id,ad.name adname,ar.name ar_name 
from t_address ad,t_area ar 
where ad.areaid=ar.id

執(zhí)行上邊的語(yǔ)句后查詢

select * from mv_address;

查詢結(jié)果如下:

物化視圖查詢結(jié)果

這時(shí),我們向地址表(T_ADDRESS)中插入一條新記錄,

insert into t_address values(8,'宏福苑小區(qū)',1,1);

再次執(zhí)行上邊的語(yǔ)句進(jìn)行查詢,會(huì)發(fā)現(xiàn)新插入的語(yǔ)句并沒(méi)有出現(xiàn)在物化視圖中。

我們需要通過(guò)下面的語(yǔ)句(PL/SQL),手動(dòng)刷新物化視圖:

begin
DBMS_MVIEW.refresh('MV_ADDRESS','C');
end;

或者通過(guò)下面的命令手動(dòng)刷新物化視圖:

EXEC DBMS_MVIEW.refresh('MV_ADDRESS','C');
注意:此語(yǔ)句需要在命令窗口中執(zhí)行。

執(zhí)行此命令后再次查詢物化視圖,就可以查詢到最新的數(shù)據(jù)了。

DBMS_MVIEW.refresh 實(shí)際上是系統(tǒng)內(nèi)置的存儲(chǔ)過(guò)程,關(guān)于存儲(chǔ)過(guò)程我們還會(huì)介紹。


3.2 創(chuàng)建自動(dòng)刷新的物化視圖,和上例一樣的結(jié)果集

語(yǔ)句如下:

create materialized view mv_address2 
refresh 
on commit
as
select ad.id,ad.name adname,ar.name ar_name 
from t_address ad,t_area ar 
where ad.areaid=ar.id

創(chuàng)建此物化視圖后,當(dāng) T_ADDRESS 表發(fā)生變化時(shí),MV_ADDRESS2 自動(dòng)跟著改變。


3.3 創(chuàng)建時(shí)不生成數(shù)據(jù)的物化視圖

create materialized view mv_address3
build deferred 
refresh
on commit
as
select ad.id,ad.name adname,ar.name ar_name 
from t_address ad,t_area ar 
where ad.areaid=ar.id;

創(chuàng)建后執(zhí)行下列語(yǔ)句查詢物化視圖

select * from mv_address3

查詢結(jié)果:

查詢物化視圖

執(zhí)行下列語(yǔ)句生成數(shù)據(jù)

begin
DBMS_MVIEW.refresh('MV_ADDRESS3','C');
end;

再次查詢,得到結(jié)果:

物化視圖

由于我們創(chuàng)建時(shí)指定的 on commit ,所以在修改數(shù)據(jù)后能立刻看到最新數(shù)據(jù),無(wú)須再次執(zhí)行 refresh


3.4 創(chuàng)建增量刷新的物化視圖

如果創(chuàng)建增量刷新的物化視圖,必須首先創(chuàng)建物化視圖日志

create materialized view log on t_address with rowid;
create materialized view log on t_area with rowid

創(chuàng)建的物化視圖日志名稱為 MLOG$_表名稱

創(chuàng)建物化視圖

create materialized view mv_address4
refresh fast
as
select ad.rowid adrowid ,ar.rowid arrowid, ad.id,ad.name 
adname,ar.name ar_name 
from t_address ad,t_area ar 
where ad.areaid=ar.id;

注意:創(chuàng)建增量刷新的物化視圖,必須:

(1)創(chuàng)建物化視圖中涉及表的物化視圖日志。

(2)在查詢語(yǔ)句中,必須包含所有表的 rowid ( 以 rowid 方式建立物化視圖日志 )

當(dāng)我們向地址表插入數(shù)據(jù)后,物化視圖日志的內(nèi)容:

物化視圖

SNAPTIME$$:用于表示刷新時(shí)間。

DMLTYPE$$:用于表示 DML 操作類(lèi)型,I 表示 INSERT,D 表示 DELETE,U表示 UPDATE。

表示舊值,U 表示 UPDATE 操作。

CHANGE_VECTOR$$:表示修改矢量,用來(lái)表示被修改的是哪個(gè)或哪幾個(gè)字段。

此列是 RAW 類(lèi)型,其實(shí) Oracle 采用的方式就是用每個(gè) BIT 位去映射一個(gè)列。

插入操作顯示為:FE, 刪除顯示為:OO 更新操作則根據(jù)更新字段的位置而顯示不同的值。

當(dāng)我們手動(dòng)刷新物化視圖后,物化視圖日志被清空,物化視圖更新。

begin
DBMS_MVIEW.refresh('MV_ADDRESS4','C');
end;


猜你喜歡:

jdbc連接oracle數(shù)據(jù)庫(kù)步驟代碼

oracle安裝和配置教程【超詳細(xì)】

oracle體系結(jié)構(gòu)是由數(shù)據(jù)庫(kù)和什么組成?

Oracle數(shù)據(jù)庫(kù)是什么?有什么特點(diǎn)?

黑馬程序員java開(kāi)發(fā)培訓(xùn)課程

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!