Oracle 物化檢視 快速重新整理 限制 說明
在老楊的Blog 看到一些列的說明,整理並轉載過來,原文連結如下:
物化檢視的快速重新整理(一)
http://yangtingkun.itpub.net/post/468/14245
物化檢視的快速重新整理(二)
http://yangtingkun.itpub.net/post/468/16456
物化檢視的快速重新整理(三)
http://yangtingkun.itpub.net/post/468/16496
物化檢視有三種重新整理方式: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的快速重新整理。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22990797/viewspace-752142/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【ORACLE】物化檢視快速重新整理限制條件Oracle
- Oracle如何根據物化檢視日誌快速重新整理物化檢視Oracle
- 【物化檢視】根據物化檢視日誌快速重新整理物化檢視的過程
- 物化檢視的快速重新整理測試與物化檢視日誌
- oracle 物化檢視重新整理方法Oracle
- Oracle 物化檢視快速重新整理對效能的影響Oracle
- Oracle 物化檢視1 - 單表聚合及其快速重新整理Oracle
- 【ORACLE】物化檢視相關後設資料檢視欄位說明Oracle
- 10G物化檢視PCT快速重新整理不再需要物化檢視日誌(三)
- 10G物化檢視PCT快速重新整理不再需要物化檢視日誌(二)
- 10G物化檢視PCT快速重新整理不再需要物化檢視日誌(一)
- oracle 物化檢視的自動重新整理方法Oracle
- 12c 物化檢視 - 對快速重新整理的理解
- 淺析為何Oracle物化檢視對distinct, group by不支援快速重新整理Oracle
- oracle物化檢視Oracle
- 包含複雜查詢的快速重新整理的物化檢視
- 12c 物化檢視 - 理解完全重新整理的物化檢視工作原理
- oracle 建立物化檢視Oracle
- Oracle 物化檢視建立Oracle
- 給物化檢視設定自動快速重新整理功能失敗
- 建立快速重新整理物化檢視使用with rowid還是with primary key?
- ZT 定位導致物化檢視無法快速重新整理的原因
- 物化檢視重新整理並非完全根據物化檢視日誌記錄
- oracle 常用檢視 簡短說明Oracle
- 基於複製的多層巢狀快速重新整理物化檢視巢狀
- 物化檢視日誌與增量重新整理
- Oracle物化檢視詳解Oracle
- ORACLE物化檢視測試Oracle
- Oracle 物化檢視案例分享Oracle
- Oracle物化檢視語法Oracle
- ORACLE物化檢視入門Oracle
- oracle物化檢視系列(二)Oracle
- oracle物化檢視系列(一)Oracle
- ogg 同步 物化檢視建立限制 Materialized ViewZedView
- ORA-12052,不能建立快速重新整理物化檢視的解決
- 物化檢視重新整理的問題及分析
- MV (Materialed View) 物化檢視的重新整理組View
- CUUG oracle物化檢視講解Oracle