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

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3076|回复: 0
打印 上一主题 下一主题

[认证考试] 物化视图的CONSIDER FRESH语句

[复制链接]
跳转到指定楼层
楼主
发表于 2019-4-30 15:45:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
物化视图的修改语句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模式下,物化视图重新可以被查询重写机制所使用。




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2024-4-30 12:34 , Processed in 0.091741 second(s), 20 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表