Materialized View

物化視圖是一種特殊的物理表,「物化」(Materialized)視圖是相對普通視圖而言的。普通視圖是虛擬表,應用的侷限性大,任何對視圖的查詢,Oracle都實際上轉換爲視圖SQL語句的查詢。這樣對總體查詢性能的提升,並無實質上的好。
    物化視圖:是包括一個查詢結果的數據庫對像,它是遠程數據的的本地副本,或者用來生成基於數據表求和的彙總表。物化視圖存儲基於遠程表的數據,也能夠稱爲快照!數據庫

特色:oracle

(1) 物化視圖在某種意義上說就是一個物理表(並且不單單是一個物理表),這經過其能夠被user_tables查詢出來,而獲得確認;函數

(2) 物化視圖也是一種段(segment),因此其有本身的物理存儲屬性;性能

(3) 物化視圖會佔用數據庫磁盤空間,這點從user_segment的查詢結果,能夠獲得佐證;ui

建立語句:create materialized view mv_name as select * from table_namespa

由於物化視圖因爲是物理真實存在的,故能夠建立索引。日誌

建立時生成數據:索引

分爲兩種:build immediate 和 build deferred,事務

build immediate是在建立物化視圖的時候就生成數據。it

build deferred則在建立時不生成數據,之後根據須要在生成數據。

若是不指定,則默認爲build immediate。

 

刷新模式:

物化視圖有二種刷新模式:

在建立時refresh mode是 on demand 仍是 on commit。

on demand 顧名思義,僅在該物化視圖「須要」被刷新了,才進行刷新(REFRESH),即更新物化視圖,以保證和基表數據的一致性;

on commit  提交觸發,一旦基表有了commit,即事務提交,則馬上刷新,馬上更新物化視圖,使得數據和基表一致。通常用這種方法在操做基表時速度會比較慢。

建立物化視圖時未做指定,則Oracle按 on demand 模式來建立。

 

上面說的是刷新的模式,針對於如何刷新,則有三種刷新方法:

 

徹底刷新(COMPLETE): 會刪除表中全部的記錄(若是是單表刷新,可能會採用TRUNCATE的方式),而後根據物化視圖中查詢語句的定義從新生成物化視圖。

快速刷新(FAST): 採用增量刷新的機制,只將自上次刷新之後對基表進行的全部操做刷新到物化視圖中去。FAST必須建立基於主表的視圖日誌。對於增量刷新選項,若是在子查詢中存在分析函數,則物化視圖不起做用。

FORCE方式:這是默認的數據刷新方式。Oracle會自動判斷是否知足快速刷新的條件,若是知足則進行快速刷新,不然進行徹底刷新。

 

關於快速刷新:Oracle物化視圖的快速刷新機制是經過物化視圖日誌完成的。Oracle經過一個物化視圖日誌還能夠支持多個物化視圖的快速刷新。物化視圖日誌根據不一樣物化視圖的快速刷新的須要,能夠創建爲ROWID或PRIMARY KEY類型的。還能夠選擇是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。

 

查詢重寫(QueryRewrite):

包括 enable query rewrite 和 disable query rewrite 兩種。

分別指出建立的物化視圖是否支持查詢重寫。查詢重寫是指當對物化視圖的基表進行查詢時,oracle會自動判斷可否經過查詢物化視圖來獲得結果,若是能夠,則避免了彙集或鏈接操做,而直接從已經計算好的物化視圖中讀取數據。

默認爲disable query rewrite。

 

語法:

create materialized view view_name
refresh [fast|complete|force]
[
on [commit|demand] |
start with (start_time) next (next_time)

]

AS subquery;

 

具體操做

 

建立物化視圖須要的權限:

grant create materialized view to user_name; 

 

在源表創建物化視圖日誌:

create materialized view log on test_table  

tablespace test_space -- 日誌空間  

with primary key;     -- 指定爲主鍵類型

 

在目標數據庫上建立MATERIALIZED VIEW:

create materialized view mv_materialized_test refresh force on demand start with sysdate next

to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),'10:25:00'),'dd-mm-yyyy hh24:mi:ss') as

select * from user_info; --這個物化視圖在天天10:25進行刷新 

 

修改刷新時間:

alter materialized view mv_materialized_test refresh force on demand start with sysdate 

next to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),' 23:00:00'),'dd-mm-yyyy hh24:mi:ss');

alter materialized view mv_materialized_test refresh force on demand start with sysdate 

next trunc(sysdate,'dd')+1+1/24; -- 天天1點刷新 

 

創建索引:

create index IDX_MMT_IU_TEST

on mv_materialized_test(ID,UNAME)  

tablespace test_space; 

 

刪除物化視圖及日誌:

drop materialized view log on test_table;    --刪除物化視圖日誌: 

drop materialized view mv_materialized_test; --刪除物化視圖
相關文章
相關標籤/搜索