包含複雜查詢的快速重新整理的物化檢視
物化檢視的快速重新整理條件在以前已經介紹過了,有的時候還有一些朋友會問我關於物化檢視快速重新整理的一些問題,其實有些時候一些複雜的物化檢視仍然可以透過多層巢狀來實現快速重新整理的。
物化檢視的快速重新整理(一):http://yangtingkun.itpub.net/post/468/14245
物化檢視的快速重新整理(二):http://yangtingkun.itpub.net/post/468/16456
物化檢視的快速重新整理(三):http://yangtingkun.itpub.net/post/468/16496
一個經過簡化的例子:
CREATE TABLE t1(c1 NUMBER);
CREATE TABLE t2(c1 NUMBER);
CREATE TABLE t3(c1 NUMBER,c2 NUMBER);
-- 建立mv的查詢
SELECT t2.c1
,t4.c1
,MAX(t3.c1)
FROM (SELECT MAX(t1.c1) c1
FROM t1) t4
,t2
,t3
WHERE t3.c1 > t4.c1
AND t2.c1 = t3.c2
GROUP BY t2.c1
,t4.c1
對於這種包含兩層巢狀的查詢,直接建立成快速重新整理方式的物化檢視顯然是不可能的,但是可以利用中間物化檢視進行過渡,而且對於10.2中,物化檢視快速重新整理的限制條件進一步放寬,使得包含MAX/MIN聚集函式的物化檢視快速重新整理的條件得以放寬:
SQL> CREATE TABLE T1(C1 NUMBER);
Table created.
SQL> CREATE TABLE T2(C1 NUMBER);
Table created.
SQL> CREATE TABLE T3(C1 NUMBER,C2 NUMBER);
Table created.
SQL> CREATE MATERIALIZED VIEW LOG ON T1
2 WITH ROWID, SEQUENCE (C1)
3 INCLUDING NEW VALUES;
Materialized view log created.
SQL> CREATE MATERIALIZED VIEW LOG ON T2
2 WITH ROWID, SEQUENCE (C1)
3 INCLUDING NEW VALUES;
Materialized view log created.
SQL> CREATE MATERIALIZED VIEW LOG ON T3
2 WITH ROWID, SEQUENCE (C1, C2)
3 INCLUDING NEW VALUES;
Materialized view log created.
SQL> CREATE MATERIALIZED VIEW MV_T4
2 REFRESH FAST AS
3 SELECT COUNT(*) CN, COUNT(C1), MAX(T1.C1) C1
4 FROM T1;
Materialized view created.
SQL> CREATE MATERIALIZED VIEW LOG ON MV_T4
2 WITH ROWID, SEQUENCE (C1)
3 INCLUDING NEW VALUES;
Materialized view log created.
SQL> CREATE MATERIALIZED VIEW MV_T123
2 REFRESH FAST AS
3 SELECT T2.C1 T2_C1, MV_T4.C1 T4_C1, COUNT(*) CNT, COUNT(T3.C1), MAX(T3.C1)
4 FROM MV_T4, T2, T3
5 WHERE T3.C1 > MV_T4.C1
6 AND T2.C1 = T3.C2
7 GROUP BY T2.C1, MV_T4.C1;
Materialized view created.
利用中間物化檢視,這種多層的快速重新整理物化檢視可以很容易的建立。
不過需要注意的是,包含MAX/MIN的物化檢視,仍然需要INSERT ONLY物化檢視,對於包含UPDATE和DELETE操作的情況是不使用的。
SQL> @?/rdbms/admin/utlxmv
Table created.
SQL> EXEC DBMS_MVIEW.EXPLAIN_MVIEW('MV_T123')
PL/SQL procedure successfully completed.
SQL> SELECT CAPABILITY_NAME, POSSIBLE, RELATED_TEXT, MSGTXT
2 FROM MV_CAPABILITIES_TABLE
3 WHERE CAPABILITY_NAME NOT LIKE '%PCT%'
4 AND CAPABILITY_NAME LIKE 'REFRESH%';
CAPABILITY_NAME P RELATED_TEXT MSGTXT
----------------------------- - ------------ ----------------------------------------------------------
REFRESH_COMPLETE Y
REFRESH_FAST Y
REFRESH_FAST_AFTER_INSERT Y
REFRESH_FAST_AFTER_ONETAB_DML N MAX(T3.C1) mv uses the MIN or MAX aggregate functions
REFRESH_FAST_AFTER_ANY_DML N see the reason why REFRESH_FAST_AFTER_ONETAB_DML is disabled
對於MAX/MIN的INSERT ONLY特性,沒有什麼太好的辦法,這裡介紹了一個例子,可以在一定程度上解決這個問題:
改造包含MAX或MIN的物化檢視:http://yangtingkun.itpub.net/post/468/492826
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-666892/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【MV】group by查詢子句是否包含count(*)對物化檢視重新整理的影響
- 【物化檢視】根據物化檢視日誌快速重新整理物化檢視的過程
- 物化檢視的快速重新整理測試與物化檢視日誌
- 基於複製的多層巢狀快速重新整理物化檢視巢狀
- Oracle如何根據物化檢視日誌快速重新整理物化檢視Oracle
- 12c 物化檢視 - 對快速重新整理的理解
- Oracle 物化檢視快速重新整理對效能的影響Oracle
- 【ORACLE】物化檢視快速重新整理限制條件Oracle
- Oracle 物化檢視 快速重新整理 限制 說明Oracle
- 【MV】物化檢視查詢重寫
- 10G物化檢視PCT快速重新整理不再需要物化檢視日誌(三)
- 10G物化檢視PCT快速重新整理不再需要物化檢視日誌(二)
- 10G物化檢視PCT快速重新整理不再需要物化檢視日誌(一)
- 12c 物化檢視 - 理解完全重新整理的物化檢視工作原理
- Oracle查詢轉換(二)複雜檢視合併Oracle
- ZT 定位導致物化檢視無法快速重新整理的原因
- 使用物化檢視查詢重寫 優化對於 UNION ALL檢視的CONNECT BY查詢優化
- DB2資料庫物化檢視:MQT物化查詢表的使用DB2資料庫MQQT
- Oracle 物化檢視1 - 單表聚合及其快速重新整理Oracle
- 【SQL】Oracle查詢轉換之物化檢視查詢重寫SQLOracle
- oracle 物化檢視重新整理方法Oracle
- oracle 物化檢視的自動重新整理方法Oracle
- 物化檢視重新整理的問題及分析
- MV (Materialed View) 物化檢視的重新整理組View
- 複雜查詢—子查詢
- ORA-12052,不能建立快速重新整理物化檢視的解決
- JPA的多表複雜查詢
- 11G物化檢視支援基於DBLINK遠端表的快速重新整理,包含有LOB欄位的表也可以進行快速重新整理了。
- 給物化檢視設定自動快速重新整理功能失敗
- 建立快速重新整理物化檢視使用with rowid還是with primary key?
- 資料複製_物化檢視
- 物化檢視重新整理並非完全根據物化檢視日誌記錄
- SQL 複雜查詢SQL
- SQL複雜查詢SQL
- Laravel使用MongoDB複雜的查詢LaravelMongoDB
- 複雜查詢語句的使用
- 物化檢視(Materialized View)的重新整理回滾約束ZedView
- 物化檢視(Materialized View)的重新整理回滾測試ZedView