物化檢視的CONSIDER FRESH語句(三)

yangtingkun發表於2010-06-23

物化檢視的修改語句ALTER MATERIALIZED VIEW包含了CONSIDER FRESH語句。透過這個語句可以使得資料庫認為物化檢視已經是重新整理後的狀態。同時可以使得這個物化檢視對於查詢重新生效。

這篇簡單討論CONSIDER FRESH語句對查詢重寫的影響。

物化檢視的CONSIDER FRESH語句(一):http://yangtingkun.itpub.net/post/468/501199

物化檢視的CONSIDER FRESH語句(二):http://yangtingkun.itpub.net/post/468/501219

 

 

CONSIDER FRESH語句的另一個主要功能就是使得物化檢視可以繼續為查詢重寫所使用。

查詢重新包括三個級別的引數:ENFORCEDTRUSTEDSTALE_TOLERATED。對於一個無法重新整理到FRESH狀態的物化檢視,只有STALE_TOLERATED級別的查詢重新可以考慮讀取這個物化檢視,而使用了CONSIDER FRESH語句後,在TRUSTED級別Oracle在查詢重寫的時候也可以使用這個物化檢視:

SQL> DROP TABLE T PURGE;

表已刪除。

SQL> DROP MATERIALIZED VIEW MV_T;

實體化檢視已刪除。

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模式下,物化檢視重新可以被查詢重寫機制所使用。

 

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

相關文章