重庆思庄Oracle、Redhat认证学习论坛

标题: 物化视图的CONSIDER FRESH语句 [打印本页]

作者: 郑全    时间: 2019-4-30 15:45
标题: 物化视图的CONSIDER FRESH语句
物化视图的修改语句ALTER MATERIALIZED VIEW包含了CONSIDER FRESH语句。通过这个语句可以使得数据库认为物化视图已经是刷新后的状态。同时可以使得这个物化视图对于查询重新生效。


CONSIDER FRESH语句的另一个主要功能就是使得物化视图可以继续为查询重写所使用。

查询重新包括三个级别的参数:ENFORCED、TRUSTED和STALE_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模式下,物化视图重新可以被查询重写机制所使用。









欢迎光临 重庆思庄Oracle、Redhat认证学习论坛 (http://bbs.cqsztech.com/) Powered by Discuz! X3.2