物化视图的修改语句ALTER MATERIALIZED VIEW包含了CONSIDER FRESH语句。通过这个语句可以使得数据库认为物化视图已经是刷新后的状态。同时可以使得这个物化视图对于查询重新生效。
这篇简单讨论CONSIDER FRESH语句对快速刷新的影响。
物化视图的CONSIDER FRESH语句(一):http://yangtingkun.itpub.net/post/468/501199
物化视图的CONSIDER FRESH的一个重要特性就是维护了物化视图的快速刷新特性。
看一个简单的例子:
SQL> DROP MATERIALIZED VIEW MV_T1;
实体化视图已删除。
SQL> DROP MATERIALIZED VIEW MV_T2;
实体化视图已删除。
SQL> DROP TABLE T PURGE;
表已删除。
SQL> CREATE TABLE T
2 (ID NUMBER PRIMARY KEY,
3 NAME VARCHAR2(30));
表已创建。
SQL> CREATE MATERIALIZED VIEW LOG ON T;
实体化视图日志已创建。
SQL> CREATE MATERIALIZED VIEW MV_T
2 REFRESH FAST
3 AS SELECT *
4 FROM T;
实体化视图已创建。
SQL> INSERT INTO T
2 VALUES (1, 'T');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> COL CHANGE_VECTOR$$ FORMAT A15
SQL> SELECT *
2 FROM MLOG$_T;
ID SNAPTIME$$ D O CHANGE_VECTOR$$ XID$$
---------- -------------- - - --------------- ----------
1 01-1月 -00 I N FE 2.8149E+15
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')
PL/SQL 过程已成功完成。
SQL> SELECT *
2 FROM MV_T;
ID NAME
---------- ------------------------------
1 T
SQL> SELECT *
2 FROM MLOG$_T;
未选定行
SQL> INSERT INTO T
2 VALUES (2, 'TEST');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> SELECT *
2 FROM MLOG$_T;
ID SNAPTIME$$ D O CHANGE_VECTOR$$ XID$$
---------- -------------- - - --------------- ----------
2 01-1月 -00 I N FE 2.2519E+15
SQL> ALTER MATERIALIZED VIEW MV_T
2 CONSIDER FRESH;
实体化视图已更改。
SQL> SELECT *
2 FROM MLOG$_T;
未选定行
SQL> SELECT *
2 FROM MV_T;
ID NAME
---------- ------------------------------
1 T
SQL> INSERT INTO T
2 VALUES (3, 'ABC');
已创建 1 行。
SQL> SELECT *
2 FROM MLOG$_T;
ID SNAPTIME$$ D O CHANGE_VECTOR$$ XID$$
---------- -------------- - - --------------- ----------
3 01-1月 -00 I N FE 2.8149E+15
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')
PL/SQL 过程已成功完成。
SQL> SELECT *
2 FROM MV_T;
ID NAME
---------- ------------------------------
1 T
3 ABC
可以看到,执行CONSIDER FRESH语句后,物化视图刷新对应的物化视图日志被从物化视图日志表中清除掉。这个操作执行之后,并不会影响物化视图的继续快速刷新,只不过物化视图中的数据会与基表中不同。
数据的不同可以通过修改物化视图日志的方式来修正,具体描述可以参考:
小议物化视图与基表数据不一致的消除(一):http://yangtingkun.itpub.net/post/468/326751
小议物化视图与基表数据不一致的消除(二):http://yangtingkun.itpub.net/post/468/327727
小议物化视图与基表数据不一致的消除(三):http://yangtingkun.itpub.net/post/468/490927
小议物化视图与基表数据不一致的消除(四):http://yangtingkun.itpub.net/post/468/494060
CONSIDER FRESH语句还有一个重要的功能,如果基表或物化视图日志导致物化视图无法快速刷新,而物化视图本身和基表数据十分接近,且数据量比较大,那么可以利用CONSIDER FRESH语句恢复物化视图的快速刷新能力:
SQL> UPDATE T
2 SET NAME = NAME;
已更新3行。
SQL> DROP MATERIALIZED VIEW LOG ON T;
实体化视图日志已删除。
SQL> CREATE MATERIALIZED VIEW LOG ON T;
实体化视图日志已创建。
SQL> UPDATE T
2 SET NAME = NAME;
已更新3行。
SQL> COMMIT;
提交完成。
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')
BEGIN DBMS_MVIEW.REFRESH('MV_T'); END;
*
第 1 行出现错误:
ORA-12034: "TEST"."T" 上的实体化视图日志比上次刷新后的内容新
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2558
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2771
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2740
ORA-06512: 在 line 1
SQL> ALTER MATERIALIZED VIEW MV_T
2 CONSIDER FRESH;
实体化视图已更改。
SQL> SELECT *
2 FROM MLOG$_T;
未选定行
SQL> UPDATE T
2 SET NAME = NAME;
已更新3行。
SQL> COMMIT;
提交完成。
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')
PL/SQL 过程已成功完成。
这是一个简单的小例子,避免了物化视图日志无法快速刷新后必须重建的问题,但是数据的不一致性还必须用户自己来解决。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-665915/ ,如需转载,请注明出处,否则将追究法律责任。