簡介: 

MView中文名稱為實體化視圖(Materialized View),相對於普通的視圖來説,MView的不同之處在於MView實體化視圖管理存儲數據,佔據數據庫的物理空間。MView的結果會保存在一個普通的數據表中,在對MView進行查詢的時候不再會對創建MView的基表進行查詢,而是直接查詢MView對應的結果表,然後通過定期的刷新機制來更新MView表中的數據。 

 

物化視圖可以查詢表,視圖和其它的物化視圖。 

 

MView在實際中的主要作用: 

1、減輕網絡負擔:通過MV將數據從一個數據庫分發到多個不同的數據庫上,通過對多個數據庫訪問來減輕對單個數據庫的網絡負擔。 

2、搭建分發環境:通過從一箇中央數據庫將數據分發到多個節點數據庫,達到分發數據的目的。 

3、複製數據子集:MV可以進行行級/列級的篩選,這樣可以複製需要的那一部分數據。 

 

實體化視圖是用於彙總,預計算,複製或分發數據的對象, 在大型的數據庫中使用它可以提高涉及到的SUM,COUNT,AVG,MIN,MAX等的表的查詢的速度。 

 

創建實體化視圖管理的用户的權限必須有: CREATE ANY MATERIALZED VIEW,CREATE TABLE,CREATE VIEW,SELECT等。 

 

創建實體化視圖: 

創建物化視圖主要語法: 
create materialized view [view_name] 
     {TABLESPACE (表空間名)}              --保存表空間 
     {BUILD [DEFERRED|IMMEDIATE(默認值)]} --延遲刷新還是立即刷新 
refresh [fast|complete|force] 
[ 
on [commit|demand] | 
start with (start_time) next (next_time) 
] 
as

{創建物化視圖用的查詢語句} 

 

相關參數説明: 

1, 

Build子句:定義創建方式,包括BUILD IMMEDIATE和BUILD DEFERRED兩種 

BUILD IMMEDIATE 在創建實體化視圖的時候就生成數據,默認 BUILD IMMEDIATE  

BUILD DEFERRED 在創建時不生成數據,以後根據需要在生成數據 

 

2, 

Refresh子句:定義數據同步刷新,當基表發生了DML操作後,實體化視圖何時採用哪種方式和基表進行同步,語法: 

[refresh [fast | complete | force] 
         [on demand | commit] 
         [start with date] 
         [next date] 
         [with {primary key | rowid}] 
]

 

FAST 採用增量刷新,只刷新自上次刷新以後進行的修改,如果指定REFRESH FAST子句,那麼應該對主表創建物化視圖日誌,如果沒有建立MView Log的話要進行快速刷新的話會報錯 

注意:對於增量刷新選項,如果在子查詢中存在分析函數,則物化視圖不起作用。 

 

COMPLETE 對整個物化視圖進行完全的刷新 

 

FORCE(默認) Oracle在刷新時會去判斷是否可以進行快速刷新,如果可以則採用Fast方式,否則採用Complete的方式,Force選項是默認選項 

 

ON DEMAND(默認) 物化視圖在用户需要的時候進行刷新,可以手工通過DBMS_MVIEW.REFRESH等方法來進行刷新,也可以通過JOB定時進行刷新 

ON COMMIT 實體化視圖在對基表的DML操作提交的同時進行刷新 

 

START WITH 第一次刷新時間 

NEXT 刷新時間間隔  

WITH PRIMARY KEY(默認) 生成主鍵實體化視圖,也就是説實體化視圖是基於表的主鍵,而不是ROWID(對應於ROWID子句)。 為了生成PRIMARY KEY子句,應該在表上定義主鍵,否則應該用基於ROWID的實體化視圖。主鍵實體化視圖允許識別實體化視圖表而不影響實體化視圖增量刷新的可用性 

WITH ROWID 只有一個單一的主表,不能包括下面任何一項: 

●Distinct 

●聚合函數 

●Group by 

●子查詢 

●連接 

●SET操作 

 

3, 

Query Rewrite子句,定義查詢重寫 

包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE兩種。分別指出創建的實體化視圖是否支持查詢重寫。查詢重寫是指當對實體化視圖的基表進行查詢時,Oracle會自動判斷能否通過查詢實體化視圖來得到結果,如果可以,則避免了聚集或連接操作,而直接從已經計算好的實體化視圖中讀取數據 

ENABLE QUERY REWRITE 支持查詢重寫 

DISABLE QUERY REWRITE 不支持查詢重寫,默認DISABLE QUERY REWRITE 

 

注意:如果需要進行快速刷新,則需要建立實體化視圖日誌。實體化視圖日誌根據不同實體化視圖的快速刷新的需要,可以建立為ROWID或PRIMARY KEY類型的。還可以選擇是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。 

 

物化視圖可以進行分區。而且基於分區的物化視圖可以支持分區變化跟蹤(PCT)。具有這種特性的物化視圖,當基表進行了分區維護操作後,仍然可以進行快速刷新操作。 

 

創建多表關聯的實體化視圖: 

實體化視圖包含多表關聯,但不包含聚合操作,僅包含表關聯的實體化視圖同樣支持在兩種情況下刷新: 

ON COMMIT 和 ON DEMAND。在 ON COMMIT 下,當基表發生DML操作並提交commit 的時候,實體化視圖被刷新。 

Oracle不允許實體化視圖中有self-jions 的存在。 

假如指定刷新方式為REFRESH FAST, oracle 執行附加的校驗,以確定fast refresh能被執行。這些附加的檢查包括: 

1 每個基表下必須創建相應的 materialized view log 

2 每個基表的rowid 必須在實體化視圖的select 語句中出現 

3 如果存在外聯接,在where 子句不能有任何的selections.並且,所有的關聯必須以AND 相連,並且用“=”操作符。 

4 如果存在外聯接,唯一性約束必須存在於外聯的 inner table 的相關列中。 

 

創建聚合類型的實體化視圖: 

為了能夠進行快速刷新(fast refersh),在select 語句中必須包含所有在group by中出現的列名,並且必須有一個count(*),所有在gorup by 中出現的列都必須有一個count(列名)出現在select 中。同樣,所有於實體化視圖相關的表上都必須創建實體化和視圖日誌。有效的聚合函數包括: 

SUM, COUNT(x),COUNT(*),AVG,VARIANCE,STDDEV,MIN,MAX被聚合的值可以是任何的 

sql表達式。 

 

REFRESH FAST 總結: 

一個包含關聯和聚合的實體化視圖是可能的。但有如下限制: 

1,實體化視圖中不能包含非複用的表達式(具有實時特徵的)。比如SYSDATE and ROWNUM. 

2,實體化視圖中不能包含RAW or LONG 數據類型。 

3,實體化視圖相關的表必須創建實體化視圖日誌,並且滿足如下條件 

  包含被實體化視圖引用到的所有的列。指定with rowid和INCLUDING NEW VALUES. 

  如果表的預期操作是inserts/direct-loads, deletes, and updates的混合,指定SEQUENCE子句只用SUM,COUNT,AVG,STDDEV,VARIANCE,MIN and MAX支持fast refresh. 

  對於每個聚合agg(expr),必須相應寫一個count(expr)與之對應. 

  如果VARIANCE(expr)or STDDEV(expr)被指定,那麼COUNT(expr)and SUM(expr) 必須被指定。在select列表中必須包含所有group by中出現的列.如果實體化視圖有如下的一點,那麼fast refresh 只支持常規DML inserts和直接路徑的裝載(direct loads) 

   a 實體化視圖包含MIN 或者 MAX 

   b 實體化視圖包含SUM(expr)但是沒有COUNT(expr) 

   c 實體化視圖中不包含COUNT(*) 

   如上的實體化視圖稱之為insert-only materialized view. 

 

包含MAX or MIN實體化視圖在delete或者混合的DML操作之後可以是 fast refresh,條件是視圖中沒有where 子句。 

(10g以上適用) 

如果沒有外聯接,在where 子句中可以包含有選擇性的條件和關聯 

如果實體化視圖中包含外聯接,fast refresh只支持在outer table被修改的情況。同樣,唯一性約束必須存在於inner join table中。如果有外聯,所有的關聯條件都必須用 AND 連接和必須用 = 操作符。