物化視圖的修改語句算法
ALTER MATERIALIZED VIEWsql
包含了數據庫
CONSIDER FRESHoracle
語句。經過這個語句能夠使得數據庫認爲物化視圖已是刷新後的狀態。同時能夠使得這個物化視圖對於查詢從新生效。ide
CONSIDER FRESH語句的另外一個主要功能就是使得物化視圖能夠繼續爲查詢重寫所使用。測試
查詢從新包括三個級別的參數:ENFORCED、TRUSTED和STALE_TOLERATED。對於一個沒法刷新到FRESH狀態的物化視圖,只有STALE_TOLERATED級別的查詢從新能夠考慮讀取這個物化視圖,而使用了CONSIDER FRESH語句後,在TRUSTED級別Oracle在查詢重寫的時候也能夠使用這個物化視圖:日誌
SQL> DROP TABLE T PURGE;get
表已刪除。string
SQL> DROP MATERIALIZED VIEW MV_T;it
實體化視圖已刪除。
SQL> CREATE TABLE T
2 (ID NUMBER,
3 NAME VARCHAR2(30),
4 TYPE VARCHAR2(18),
5 CREATE_DATE DATE);
表已建立。
SQL> INSERT INTO T
2 SELECT ROWNUM,
3 OBJECT_NAME,
4 OBJECT_TYPE,
5 CREATED
6 FROM ALL_OBJECTS;
已建立55680行。
SQL> COMMIT;
提交完成。
SQL> CREATE MATERIALIZED VIEW LOG ON T
2 WITH ROWID, SEQUENCE (TYPE)
3 INCLUDING NEW VALUES;
實體化視圖日誌已建立。
SQL> CREATE MATERIALIZED VIEW MV_T
2 REFRESH FAST
3 ENABLE QUERY REWRITE
4 AS SELECT TYPE, COUNT(*)
5 FROM T
6 GROUP BY TYPE;
實體化視圖已建立。
首先創建了測試的物化視圖,而後檢查一下查詢重寫的配置:
SQL> SHOW PARAMETER QUERY_REWRITE
NAME TYPE VALUE
query_rewrite_enabled string TRUE
query_rewrite_integrity string enforced
SQL> @?/rdbms/admin/utlxrw
表已建立。
SQL> EXEC DBMS_MVIEW.EXPLAIN_REWRITE('SELECT TYPE, COUNT(*) FROM T GROUP BY TYPE')
PL/SQL 過程已成功完成。
SQL> SELECT MESSAGE
2 FROM REWRITE_TABLE;
MESSAGE
QSM-01151: 已重寫查詢
QSM-01209: 已經過實體化視圖 MV_T, 採用文本匹配算法進行了查詢重寫
SQL> TRUNCATE TABLE REWRITE_TABLE;
表被截斷。
SQL> INSERT INTO T
2 VALUES (1, 'TEST', 'T', SYSDATE);
已建立 1 行。
SQL> COMMIT;
提交完成。
SQL> EXEC DBMS_MVIEW.EXPLAIN_REWRITE('SELECT TYPE, COUNT(*) FROM T GROUP BY TYPE')
PL/SQL 過程已成功完成。
SQL> SELECT MESSAGE
2 FROM REWRITE_TABLE;
MESSAGE
QSM-01150: 未重寫查詢
QSM-01029: 實體化視圖 MV_T 在 ENFORCED 完整性模式中已過期
SQL> ALTER SESSION SET QUERY_REWRITE_INTEGRITY = STALE_TOLERATED;
會話已更改。
SQL> TRUNCATE TABLE REWRITE_TABLE;
表被截斷。
SQL> EXEC DBMS_MVIEW.EXPLAIN_REWRITE('SELECT TYPE, COUNT(*) FROM T GROUP BY TYPE')
PL/SQL 過程已成功完成。
SQL> SELECT MESSAGE
2 FROM REWRITE_TABLE;
MESSAGE
QSM-01151: 已重寫查詢
QSM-01209: 已經過實體化視圖 MV_T, 採用文本匹配算法進行了查詢重寫
SQL> TRUNCATE TABLE REWRITE_TABLE;
表被截斷。
SQL> ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED;
會話已更改。
SQL> EXEC DBMS_MVIEW.EXPLAIN_REWRITE('SELECT TYPE, COUNT(*) FROM T GROUP BY TYPE')
PL/SQL 過程已成功完成。
SQL> SELECT MESSAGE
2 FROM REWRITE_TABLE;
MESSAGE
QSM-01150: 未重寫查詢
QSM-01031: 實體化視圖 MV_T 在 TRUSTED 完整性模式中已過期
能夠看到,和前面分析的同樣,一旦物化視圖的數據和基表中的最新的數據存在差別,這個物化視圖在TRUSTED模式下沒法被查詢重寫所使用。
下面使用CONSIDER FRESH語句:
SQL> TRUNCATE TABLE REWRITE_TABLE;
表被截斷。
SQL> ALTER MATERIALIZED VIEW MV_T
2 CONSIDER FRESH;
實體化視圖已更改。
SQL> EXEC DBMS_MVIEW.EXPLAIN_REWRITE('SELECT TYPE, COUNT(*) FROM T GROUP BY TYPE')
PL/SQL 過程已成功完成。
SQL> SELECT MESSAGE
2 FROM REWRITE_TABLE;
MESSAGE
QSM-01151: 已重寫查詢
QSM-01209: 已經過實體化視圖 MV_T, 採用文本匹配算法進行了查詢重寫
經過使用CONSIDER FRESH,數據庫從新認爲物化視圖已經和基表的數據保持一致,所以TRUSTED模式下,物化視圖從新能夠被查詢重寫機制所使用。