網(wǎng)站建設(shè)是什么科目今日的新聞?lì)^條10條
文章目錄
- 含義
- 物化視圖的語法
- 物化視圖的創(chuàng)建
- 1、自動(dòng)刷新的物化事務(wù) ON COMMIT
- 2、非自動(dòng)刷新的物化視圖 ON demand
- 關(guān)于手動(dòng)刷新
- 物化視圖的刪除
- 資料參考
含義
什么是物化視圖
?
物化視圖,通俗點(diǎn)說就是
物理化
的視圖。
什么叫物理化
?
將視圖以表結(jié)構(gòu)的方式,存儲(chǔ)在磁盤中。
在之前的博客中針對(duì)普通視圖說過,普通視圖的本質(zhì)就是一段 SQL 語句
,本身的數(shù)據(jù)不會(huì)存儲(chǔ)在磁盤上,每次查詢時(shí),普通視圖中的數(shù)據(jù),來源于重新執(zhí)行視圖中的SQL語句
。
普通視圖就是將
復(fù)雜的
、可共用的
SQL片段的封裝。
但是,每次進(jìn)行視圖查詢操作時(shí),都將觸發(fā)視圖中的sql再次執(zhí)行,程序的執(zhí)行,存在執(zhí)行快慢的問題,在程序界中存在一個(gè)說法叫時(shí)間復(fù)雜度
。
物化視圖
相比普通視圖而言,是將原本的普通視圖中的SQL轉(zhuǎn)換成了對(duì)應(yīng)的表結(jié)構(gòu),并會(huì)在磁盤空間中進(jìn)行存儲(chǔ)。
可以理解為就是一張由SQL語句和查詢字段構(gòu)成的新的表。
當(dāng)然,作為表
而言,相對(duì)應(yīng)的比如索引
等操作也都可以實(shí)現(xiàn)。
但是物化視圖
由于占用了更多的服務(wù)器內(nèi)存空間,也就導(dǎo)致出現(xiàn)空間復(fù)雜度
的問題。
程序的效率,無非就是在
時(shí)間復(fù)雜度
與空間復(fù)雜度
的取舍。
物化視圖的語法
物化視圖的創(chuàng)建語法,如下所示:
create materialized
view [view_name]
refresh [fast
|complete
|force
]
[
on [commit
|demand
] |
start with (start_time) next (next_time)
]
as
{創(chuàng)建物化視圖用的查詢語句}
其中,各項(xiàng)關(guān)鍵字說明如下:
名稱 | 用途 | 含義 |
---|---|---|
materialized | 物化視圖關(guān)鍵字 | 物理化 |
fast | 刷新方式 | 增量更新,只會(huì)刷新自上次刷新以后的修改內(nèi)容。 |
complete | 刷新方式 | 全部刷新。相當(dāng)于重新執(zhí)行一次創(chuàng)建視圖的查詢語句。 |
force | 刷新方式 | (默認(rèn)刷新方式)由oracle在需要進(jìn)行刷新操作時(shí),當(dāng)可以使用fast模式時(shí),數(shù)據(jù)刷新將采用fast方式;否則使用complete方式。 |
on commit | 刷新時(shí)間(模態(tài)) | 在基表 數(shù)據(jù)事務(wù)提交 時(shí),立即刷新對(duì)應(yīng)物化視圖。 |
on demand | 刷新時(shí)間(模態(tài)) | (oracle的默認(rèn)類型)在用戶需要刷新的時(shí)候進(jìn)行刷新操作。這里就要求用戶自己動(dòng)手去刷新數(shù)據(jù)了(也可以使用job定時(shí)刷新) |
start with (start_time) next (next_time) | 刷新時(shí)間 | 從指定的時(shí)間開始,每隔一段時(shí)間(由next指定)就刷新一次 |
物化視圖的創(chuàng)建
1、自動(dòng)刷新的物化事務(wù) ON COMMIT
按照上面的語法與參數(shù)說明,創(chuàng)建一個(gè)簡單的物化視圖。
創(chuàng)建一張物化視圖表,要求在事務(wù)提交后,立刻自動(dòng)刷新物化視圖數(shù)據(jù)。
create MATERIALIZED VIEW mv_bl_user_list
refresh force -- 由oracle決定該刷新的時(shí)候,采取何種方式執(zhí)行
ON COMMIT -- 刷新模態(tài),觸發(fā)點(diǎn)
AS
SELECT * FROM bl_user_list
測試:
1、先執(zhí)行物化視圖的創(chuàng)建sql
2、查詢基表數(shù)據(jù)信息
3、查詢物化視圖的數(shù)據(jù)信息
4、新增或者更新基表的數(shù)據(jù)
5、查詢物化視圖。
6、觀察新增的數(shù)據(jù)是否自動(dòng)刷新至物化視圖中。
基表數(shù)據(jù)事務(wù)提交后,對(duì)應(yīng)的物化視圖數(shù)據(jù)也會(huì)同步及時(shí)變更!
2、非自動(dòng)刷新的物化視圖 ON demand
創(chuàng)建一個(gè)需要手動(dòng)刷新數(shù)據(jù)
的物化視圖。
CREATE MATERIALIZED VIEW mv_bl_user_list
refresh force
ON demand
AS
SELECT * FROM bl_user_list
測試:
1、先執(zhí)行物化視圖的創(chuàng)建sql
2、查詢基表數(shù)據(jù)信息
3、查詢物化視圖的數(shù)據(jù)信息
4、新增或者更新基表的數(shù)據(jù)
5、查詢物化視圖。
6、觀察新增的數(shù)據(jù)是否自動(dòng)刷新至物化視圖中。
基表的數(shù)據(jù)事務(wù)提交后,對(duì)應(yīng)物化視圖中的數(shù)據(jù)并不會(huì)自動(dòng)刷新!
關(guān)于手動(dòng)刷新
如果在創(chuàng)建物化視圖時(shí),設(shè)定刷新模態(tài)為 on demand
時(shí),會(huì)需要用戶進(jìn)行手動(dòng)刷新
操作。
比如,將上述的非自動(dòng)刷新視圖進(jìn)行數(shù)據(jù)刷新操作。
begin
--dbms_mview.refresh(TAB=>'mv_bl_user_list',METHOD=>'COMPLETE',PARALLELISM=>8);dbms_mview.refresh('mv_bl_user_list','COMPLETE');
end;
物化視圖的刪除
drop materialized view 物化視圖名
資料參考
Oracle物化視圖-看這一篇就可以了