Oracle 物化檢視 快速重新整理 限制 說明

n-lauren發表於2013-01-05

在老楊的Blog 看到一些列的說明,整理並轉載過來,原文連結如下:

 

物化檢視的快速重新整理(一)

http://yangtingkun.itpub.net/post/468/14245

 

物化檢視的快速重新整理(二)

http://yangtingkun.itpub.net/post/468/16456

 

物化檢視的快速重新整理(三)

http://yangtingkun.itpub.net/post/468/16496

 

 

物化檢視有三種重新整理方式:COMPLETEFASTFORCE:

1)完全重新整理(COMPLETE會刪除表中所有的記錄(如果是單表重新整理,可能會採用TRUNCATE的方式),然後根據物化檢視中查詢語句的定義重新生成物化檢視。

2)快速重新整理(FAST採用增量重新整理的機制,只將自上次重新整理以後對基表進行的所有操作重新整理到物化檢視中去。

3FORCE方式,這是預設方式。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的快速重新整理。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22990797/viewspace-752142/,如需轉載,請註明出處,否則將追究法律責任。

相關文章