本文介紹了Oracle中具有快速刷新功能的實例化視圖,而不是完成大量工作(&A)的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我已經(jīng)創(chuàng)建了一個具有這樣的刷新完成的實例化視圖,并且運行良好:
CREATE MATERIALIZED VIEW VM4
Build immediate
refresh complete on commit
AS
select C.codecomp,
count(c.numpolice) as NbContrat,
SUM(c.montant) as MontantGlobal
from contrat C
group by c.codecomp;
現(xiàn)在我想創(chuàng)建一個類似的視圖,但使用快速刷新,但它不起作用,它向我顯示以下錯誤:
error
知道我已經(jīng)創(chuàng)建了對應表的日志,就像這樣:
CREATE MATERIALIZED VIEW LOG ON contrat with rowid ;
推薦答案
檢查documentation:
快速刷新的一般限制
實例化視圖的定義查詢限制如下:
實例化視圖不得包含對SYSDATE和ROWNUM等非重復表達式的引用。
實例化視圖不得包含對RAW或LONG RAW數(shù)據(jù)類型的引用。
它不能包含選擇列表子查詢。
它不能在SELECT子句中包含分析函數(shù)(例如,RANK)。
它不能引用定義了XMLIndex索引的表。
不能包含MODEL子句。
它不能包含子查詢的HAVING子句。
它不能包含具有ANY、ALL或不存在的嵌套查詢。
不能包含[以…開頭]CONNECT BY子句。
它不能包含不同站點的多個明細表。
在提交實例化視圖時不能有遠程詳細信息表。
嵌套實例化視圖必須具有聯(lián)接或聚合。
帶有GROUP BY子句的實例化聯(lián)接視圖和實例化聚合視圖不能從按索引組織的表中進行選擇。
聚合實例化視圖的快速刷新限制
使用聚合或聯(lián)接為實例化視圖定義查詢具有
以下是對快速刷新的限制:“快速刷新的一般限制”中的所有限制。
在提交時和按需時都支持快速刷新
實例化視圖,但有以下限制:實例化視圖中的所有表都必須有實體化視圖日志,并且實例化視圖日志必須:
包含實例化視圖中引用的表中的所有列。
指定WITH ROWID并包含新值。
如果希望表混合插入/直接加載、刪除和更新,請指定SEQUENCE子句。
僅支持SUM、COUNT、AVG、STDDEV、VARIANCE、MIN和MAX進行快速刷新。
必須指定count(*)。
聚合函數(shù)只能作為表達式的最外層出現(xiàn)。即,諸如AVG(AVG(X))或AVG(X)+AVG(X)之類的聚集體
是不允許的。對于AVG(Expr)等每個聚合,必須存在相應的計數(shù)(Expr)。Oracle建議將SUM(EXPR)設(shè)置為
指定的。請參見將實例化視圖與一起使用的要求
匯總以了解更多詳細信息。如果指定VARIANCE(EXPR)或STDDEV(EXPR),則必須指定COUNT(EXPR)和SUM(EXPR)。Oracle建議將SUM(EXPR*EXPR)
指定的。請參見將實例化視圖與一起使用的要求
匯總以了解更多詳細信息。定義查詢中的SELECT列不能是包含多個基表中的列的復雜表達式。一個可能的
解決此問題的方法是使用嵌套實例化視圖。選擇列表必須包含所有GROUP BY列。
實例化視圖不是基于一個或多個遠程表。
/li>
如果在實例化視圖日志的篩選器列中使用CHAR數(shù)據(jù)類型,則主體站點和
實例化視圖必須相同。如果實例化視圖具有以下條件之一,則僅在傳統(tǒng)DML插入和直接DML上支持快速刷新
加載。具有最小或最大聚合的實例化視圖
有和(Expr)但沒有計數(shù)(Expr)的實例化視圖
不帶計數(shù)的實例化視圖(*)
這樣的實例化視圖稱為僅插入實例化視圖。
如果包含MAX或MIN的實例化視圖沒有WHERE子句,則在DELETE或MIXED DML語句后可以快速刷新該實例化視圖。
刪除或混合DML后的最大/最小快速刷新與僅插入情況下的行為不同。它刪除并重新計算
受影響組的最大/最小值。你需要注意的是
其性能影響。在FROM子句中包含命名視圖或子查詢的實例化視圖可以快速刷新,前提是這些視圖可以完全
合并了。有關(guān)合并哪些視圖的信息,請參閱Oracle數(shù)據(jù)庫
SQL優(yōu)化指南。如果沒有外部聯(lián)接,您可以在WHERE子句中進行任意選擇和聯(lián)接。
在常規(guī)DML和直接加載之后,具有外連接的實例化聚合視圖是可快速刷新的,只要
外部表已修改。此外,唯一約束必須存在于
內(nèi)聯(lián)接表的聯(lián)接列。如果有外部連接,
所有連接必須由AND連接,并且必須使用等號(=)
運算符。對于具有CUBE、ROLLUP、GROUPING SETS或它們的串聯(lián)的實體化視圖,適用以下限制:
選擇列表應包含分組識別符,它可以是所有GROUP BY表達式上的GROUPING_ID函數(shù),也可以是
GROUPING函數(shù)用于每個GROUP BY表達式。例如,如果
實例化視圖的GROUP BY子句是”GROUP BY CUBE(a,b)”,
則選擇列表應包含”GROUPING_ID(a,b)”或
“分組(A)和分組(B)”以使實例化視圖更快
可刷新。GROUP BY不應導致任何重復分組。例如,”group by a,ROLLUP(a,b)”不能快速刷新,因為它
導致重復分組”(A)、(a、b)和(A)”。
我想你錯過了
必須指定count(*)。
對于AVG(Expr)等每個聚合,必須存在相應的計數(shù)(Expr)。
指定WITH ROWID并包含新值。
如果希望表混合插入/直接加載、刪除和更新,請指定SEQUENCE子句。
這篇關(guān)于Oracle中具有快速刷新功能的實例化視圖,而不是完成大量工作(&A)的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,