建立视图怎么去掉重复行_物化视图的CONSIDER FRESH语句

fda496011ada0bb06bba688d29fcd212.png

物化视图的修改语句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模式下,物化视图重新可以被查询重写机制所使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值