1. 程式人生 > >Oracle物化視圖詳解

Oracle物化視圖詳解

zed 增量 建立 存在 表名 row $$ dbm 數據

現實工作中會有多個數據源同步到一個數據庫完成數據分析的場景,這些數據可以不是實時同步的,我們一般通過定時任務抽取數據到統計分析庫給應用使用。

一般的同步方式可以通過時間戳做全量和增量數據同步(存在原數據變化可能,數據不一致的情況),也可以通過dblink做數據實時查詢(較損耗線上數據庫性能),一般最好的方式是通過建立物化視圖,然後通過schedual job完成定時數據同步,這裏就記錄下物化視圖的使用。

一、物化視圖簡介

物化視圖是一種特殊的物理表,“物化”(Materialized)視圖是相對普通視圖而言的。普通視圖是虛擬表,應用的局限性大,任何對視圖的查詢,Oracle都實際上轉換為視圖SQL語句的查詢。這樣對整體查詢性能的提高,並沒有實質上的好處。

1、物化視圖分類

ON DEMAND:該物化視圖“需要”被刷新了,才進行刷新(REFRESH),即更新物化視圖,以保證和基表數據的一致性;

ON COMMIT:一旦基表有了COMMIT,即事務提交,則立刻刷新,立刻更新物化視圖,使得數據和基表一致

默認情況創建物化視圖不指定類型,則是按需刷新(on demand)

2、物化視圖

二、物化視圖使用

1、物化視圖創建

物化視圖的數據來源於基表,而刷新的起始點記錄於物化視圖日誌,所以創建物化視圖授權必須有基表——>物化視圖日誌(基於基表)——>物化視圖

物化視圖創建示例:

在dbtest下創建物化視圖T,其中基表是scott用戶下的dept表
(
1)授權dbtest用戶可以查詢scott.dept grant select on scott.dept to dbtest; (2)在dbtest用戶下創建表T (若創建物化視圖加on prebuilt table)
create table t as select * from scott.dept where 1=2;
3)在scott用戶下創建物化視圖日誌,在dbtest下創建物化視圖T
創建物化視圖日誌:
conn scott
/tiger;
create materialized view log on dept;
grant select on MLOG$_DEPT to dbtest;
創建物化視圖:
conn dbtest
/dbtest;
create materialized view T
on prebuilt table
refresh fast
on demand as select deptno,dname,loc,ACOLUMN from scott.dept;

##可以通過在 view T後加上BUILD IMMEDIATE參數立刻刷新物化視圖,得到數據

REFRESH 子句可以包含如下部分:
[refresh [fast|complete|force]
[on demand | commit]
[start with date] [next date]
[with {primary key|rowid}]]

2、物化視圖刷新

當基表有更新後(DML),如果不是on commit類型,物化視圖需要刷新後數據才能保持和基表一致,刷新方式有全量刷新(COMPLETE)、快速刷新(增量FAST)、強制刷新(FORCE)、不刷新(NEVER)

FAST:增量快速刷新

exec dbms_mview.refresh(表名, F)  

exec dbms_mview.refresh(‘dbtest.t‘,‘F‘);

COMPLETE:全量刷新

exec dbms_mview.refresh(表名, C)   ;

exec dbms_mview.refresh(‘dbtest.t‘,‘C‘);

FORCE:刷新時判斷否可以快速刷新,如果能快速刷新則執行fast刷新,如果不能則執行complete刷新

NEVER:不刷新

3、物化視圖刪除

drop MATERIALIZED VIEW  mview_name;

4、物化視圖日誌刪除

物化視圖日誌是mlog$_basetablename命名格式

DROP MATERIALIZED VIEW LOG  on base_table_name;
MLOG$_DEPT 

 DEPTNO           主鍵列
 SNAPTIME$$       用於表示刷新時間
 DMLTYPE$$        用於表示dml操作類型,i表示insert,d表示delete,u表示update
 OLD_NEW$$        用於表示這個值是新值還是舊值。n(ew)表示新值(一般為delete操作),o(ld)表示舊值(一般為Insert操作),u表示update操作。
 CHANGE_VECTOR$$  表示修改矢量,用來表示被修改的是哪個或哪幾個字段
 XID$$              

如果with後面跟了primary key,則物化視圖日誌中會包含主鍵列。
如果with後面跟了rowid,則物化視圖日誌中會包含: m_row$$:用來存儲發生變化的記錄的rowid。
如果with後面跟了object id,則物化視圖日誌中會包含:sys_nc_oid$:用來記錄每個變化對象的對象id。
如果with後面跟了sequence,則物化視圖日子中會包含:sequence$$:給每個操作一個sequence號,從而保證刷新時按照順序進行刷新。
如果with後面跟了一個或多個column名稱,則物化視圖日誌中會包含這些列。  

當基本表發生dml操作時,會記錄到物化視圖日誌中,這時指定的時間4000年1月1日0時0分0秒(物化視圖未被刷新)。
如果物化視圖日誌供多個物化視圖使用,則一個物化視圖刷新後會將它刷新的記錄的時間更新為它刷新的時間。
只有建立快速刷新的物化視圖才能使用物化視圖日誌,如果只建立一個物化視圖,則物化視圖刷新完會將物化視圖日誌清除掉

--當創建物化視圖日誌使用primary key時,oracle創建臨時表 RUPD$_基礎表

5、查看物化視圖

set line 200;
set pagesize 20000;
col owner for a15;
col mview_name for a30;
col query for a60;

select owner,mview_name,refresh_method,last_refresh_date,compile_state from dba_mviews;

#如果要看具體語句,可以通過query字段查看

三、附錄

物化視圖是一種特殊的物理表,“物化”(Materialized)視圖是相對普通視圖而言的。普通視圖是虛擬表,應用的局限性大,任何對視圖的查詢,Oracle都實際上轉換為視圖SQL語句的查詢。這樣對整體查詢性能的提高,並沒有實質上的好處。

Oracle物化視圖詳解