一、物化視圖簡介
物化視圖分類
物化視圖分類,物化視圖語法和as后面的sql分為:
- (1) 基於主鍵的物化視圖(主鍵物化視圖)
- (2)基於Rowid的物化視圖(Rowid物化視圖)
本博客介紹一下Oracle的物化視圖,物化視圖(Materialized view)是相對與普通視圖而已的,普通視圖是偽表,功能沒那么多,而物化視圖創建是需要占用一定的存儲空間的,物化視圖常被應用與調優一些列表SQL查詢,物化視圖的基本語法:
create materialized view [視圖名稱]
build immediate | deferred
refresh fase | complete | force
on demand | commit
start with [start time]
next [next time]
with primary key | rowid //可以省略,一般默認是主鍵物化視圖
as [要執行的SQL]
ok,解釋一下這些語法用意:
build immediate | deferred (視圖創建的方式):
- (1) immediate:表示創建物化視圖的時候是生成數據的;
- (2) deferre:就相反了,只創建物化視圖,不生成數據
refresh fase | complete | force (視圖刷新的方式):
- (1) fase:增量刷新,也就是距離上次刷新時間到當前時間所有改變的數據都刷新到物化視圖,注意,fase模式必須創建視圖日志
- (2) complete:全量更新的,complete方式相當於創建視圖重新全部查一遍
- (3) force:視圖刷新方式的默認方式,當增量刷新可用則增量刷新,當增量刷新不可用,則全量刷新,一般不要用默認方式
on demand | commit start with ... next ...(視圖刷新時間):
- (1) demand:根據用戶需要刷新時間,也就是說用戶要手動刷新
- (2) commit:事務一提交,就自動刷新視圖
- (3) start with:指定首次刷新的時間,一般用當前時間
- (4) next:物化視圖刷新數據的周期,格式一般為“startTime+時間間隔”
二、實踐:創建物化視圖
上面是物化視圖主要語法的簡介,下面可以實踐一下,創建一個主鍵物化視圖
ps:創建一個名稱為MV_T的物化視圖,視圖創建完成是生成數據的,增量刷新,根據用戶需要刷新,每隔兩天刷新一次視圖
create materialized view MV_T
build immediate
refresh fast
on demand
start with sysdate
next sysdate + 2
as select * from sys_user;
可能遇到問題:
(1)、ORA-12014: 表 不包含主鍵約束條件
SQL> create materialized view mv_t
2 build immediate
3 refresh fast
4 on demand
5 start with sysdate
6 next sysdate + 2
7 as select * from sys_user;
as select * from sys_user;
第 7 行出現錯誤:
ORA-12014: 表 'SYS_USER' 不包含主鍵約束條件
這是因為as SQL語句的表沒創建主鍵,而是使用的是基於表的物化視圖,解決方法是新建主鍵
(2)、ORA-23413: 表不帶實體化視圖日志
SQL> create materialized view mv_t
2 build immediate
3 refresh fast
4 on demand
5 start with sysdate
6 next sysdate + 2
7 as select * from sys_user;
as select * from sys_user;
第 7 行出現錯誤:
ORA-23413: 表 "T_BASE"."SYS_USER" 不帶實體化視圖日志
這是因為refresh方式用fast方式,fast增量方式必須創建視圖日志
create materialized view log on [表名];
刪除視圖日志:
drop materialized view log on [表名]
假如是基於Rowid的物化視圖,就可以用這種方法:
create materialized view log on [表名] with rowid;
附錄:物化視圖常用SQL
- 刪除物化視圖:
drop materialized view [視圖名稱];
- 查看物化視圖:
select mv.* from user_mviews mv where mv.MVIEW_NAME = [視圖名稱];
- 查看物化視圖列:
select sg.segment_name, sg.bytes, sg.blocks from user_segments sg where sg.segment_name = [視圖名稱];
- 手動刷新物化視圖:
exec dbms_mview.refresh([視圖名稱]);