ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 物化视图的CONSIDER FRESH语句(二)

物化视图的CONSIDER FRESH语句(二)

原创 Linux操作系统 作者:yangtingkun 时间:2010-06-22 23:53:06 0 删除 编辑

物化视图的修改语句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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1964
  • 访问量
    11077260