物化視圖有三種重新整理方式:COMPLETE、FAST和FORCE:
(1)完全重新整理(COMPLETE)會刪除表中所有的記錄(如果是單表重新整理,可能會採用TRUNCATE的方式),然後根據物化視圖中查詢語句的定義重建物化視圖。
(2)快速重新整理(FAST)採用增量重新整理的機制,只將自上次重新整理以後對基表進行的所有操作重新整理到物化視圖中去。
(3)FORCE方式,這是預設。Oracle會自動判斷是否滿足快速重新整理的條件,如果滿足則進行快速重新整理,否則進行完全重新整理。
顯然快速重新整理是物化視圖重新整理方式的首選。但是,不是所有的物化視圖都可以進行快速重新整理,只有滿足某些條件的物化視圖才具有快速重新整理的能力。
根據查詢的不同,快速重新整理的限制條件也不相同,下面總結一下不同類型的物化視圖對快速重新整理的限制條件。
補充:
老楊說的這些限時是基於Oracle 9i的版本,隨著Oracle 版本的升級,這些限制也放的越來越寬。
一.所有類型的快速重新整理物化視圖都必須滿足的條件
1.物化視圖不能包含對不重複表格達式的引用,如SYSDATE和ROWNUM;
2.物化視圖不能包含對LONG和LONG RAW資料類型的引用。
二.只包含串連的物化視圖
1.必須滿足所有快速重新整理物化視圖都滿足的條件;
2.不能包括GROUP BY語句或聚集操作;
3.如果在WHERE語句中包含外串連,那麼唯一約束必須存在於串連中內表的串連列上;
4.如果不包含外串連,那麼WHERE語句沒有限制,如果包含外串連,那麼WHERE語句中只能使用AND串連,並且只能使用“=”操作。
5.FROM語句列表中所有表的ROWID必須出現在SELECT語句的列表中。
6.FROM語句列表中的所有表必須建立基於ROWID類型的物化視圖日誌。
三.包含聚集的物化視圖
1.必須滿足所有快速重新整理物化視圖都滿足的條件;
2.物化視圖查詢的所有表必須建立物化視圖日誌,且物化視圖日誌必須滿足下列限制:
(1)包含物化視圖查詢語句中的所有列,包括SELECT列表中的列和WHERE語句中的列;
(2)必須指明ROWID和INCLUDING NEW VALUES;
(3)如果對基本的操作同時包括INSERT、UPDATE和DELETE操作(即不是只包含INSERT操作),那麼物化視圖日誌應該包括SEQUENCE。
3.允許的聚集合函式包括:SUM、COUNT、AVG、STDDEV、VARIANCE、MIN和MAX;
4.必須指定COUNT(*);
不加COUNT(*),建立快速重新整理的物化視圖會成功,但通過執行EXPLAIN_MVIEW過程,可以發現, COUNT(*)對於INSERT操作是可以快速重新整理的,不過對於UPDATE和DELETE則會造成快速重新整理的失敗。
5.如果指明了除COUNT之外的聚集合函式,則COUNT(expr)也必須存在;
比如:包含SUM(a),則必須同時包含COUNT(a)。
6.如果指明了VARIANCE(expr)或STDDEV(expr),除了COUNT(expr)外,SUM(expr)也必須指明;
Oracle推薦同時包括SUM(expr*expr)。
7.SELECT列表中必須包括所有的GROUP BY列;
8.當物化視圖屬於下面的某種情況,則快速重新整理只支援常規DML插入和直接裝載,這種類型的物化視圖又稱為INSERT-ONLY物化視圖;
物化視圖包含MIN或MAX聚集合函式;
物化視圖包含SUM(expr),但是沒有包括COUNT(expr);
物化視圖沒有包含COUNT(*)。
注意:如果建立了這種物化視圖且重新整理機制是ON COMMIT的,則會存在潛在的問題。當出現了UPDATE或DELETE語句,除非手工完全重新整理解決這個問題,否則物化視圖至此以後都不再自動重新整理,且不會報任何錯誤。
9.如果包含inline views、outer joins、self joins或grouping set,則相容性的設定必須在9.0以上;
10.如果物化視圖建立在視圖或子查詢上,則要求視圖必須可以完全合并的。
11.如果沒有外串連,則對WHERE語句沒有限制。如果包含外串連,則要求WHERE語句只能包括AND串連和“=”操作。對於包含外串連的聚集物化視圖,快速重新整理支援outer表的修改。且inter表的串連列上必須存在唯一約束。
12.對於包含了ROLLUP、CUBE、GROUPING SET的物化視圖必須滿足下列限制條件:
SELECT語句列表中應該包含GROUPING標識符:可以是GROUP BY運算式中所有列的GROUPING_ID函數,也可以是GROUP BY運算式中每一列的GROUPING函數;
例如:GROUP BY語句為:GROUP BY CUBE(a, b),則SELECT列表應該包括GROUPING_ID(a, b)或者GROUPING(a)和GROUPING(b)。
GROUP BY不能產生重複的GROUPING。
比如:GROUP BY a,ROLLUP(a, b)則不支援快速重新整理,因為包含了重複的GROUPING:(a), (a, b), (a)。
四.包含UNION ALL的物化視圖
1.UNION ALL操作必須在查詢的頂層。可以有一種情況例外:UNION ALL在第二層,而第一層的查詢語句為SELECT * FROM;
2.被UNION ALL操作串連在一起的每個查詢塊都應該滿足快速重新整理的限制條件;
3.SELECT列表中必須包含一列維護列,叫做UNION ALL標識符,每個UNION ALL分支的標識符列應包含不同的常量值;
4.不支援外串連、遠端資料庫表和包括只允許插入的聚集物化視圖定義查詢;
5.不支援基於分區改變跟蹤(PCT)的重新整理;
6.相容性設定應設定為9.2.0。
五.嵌套物化視圖
嵌套物化視圖的每層都必須滿足快速重新整理的限制條件;
對於同時包含聚集和串連的嵌套物化視圖,不支援ON COMMIT的快速重新整理。
轉載:http://blog.csdn.net/tianlesoftware/article/details/7719679