ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle11gr2物化视图日志新增PURGE语句

Oracle11gr2物化视图日志新增PURGE语句

原创 Linux操作系统 作者:yangtingkun 时间:2010-03-15 23:58:58 0 删除 编辑

在11.2中,物化视图日志也新增了一些功能,物化视图日志新增了PURGE语句,使得物化视图日志的清除和物化视图的刷新分离,从而提高物化视图的刷新性能。

 

 

在以往的版本中,物化视图刷新完成之前,需要清除物化视图日志中的记录,清除的标准是这些记录没有任何一个物化视图的刷新需要用到。

显然,这个DELETE的操作势必会影响物化视图刷新的性能。现在Oracle提供了专门的PURGE语句,使得物化视图日志的清除工作可以和刷新分离开,这样物化视图刷新的性能可以得以提高。

SQL> SELECT * FROM V$VERSION;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

会话已更改。

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
2010-01-18 05:11:47

SQL> CREATE TABLE T
  2  (ID NUMBER PRIMARY KEY,
  3  NAME VARCHAR2(30),
  4  AGE NUMBER);

表已创建。

SQL> CREATE MATERIALIZED VIEW LOG ON T
  2  PURGE START WITH SYSDATE + 5/1440
  3  REPEAT INTERVAL '5' MINUTE;

实体化视图日志已创建。

SQL> CREATE MATERIALIZED VIEW MV_T
  2  REFRESH FAST
  3  AS SELECT * FROM T;

实体化视图已创建。

SQL> INSERT INTO T
  2  VALUES (1, 'TEST', 18);

已创建 1 行。

SQL> SELECT * FROM MLOG$_T;

        ID SNAPTIME$$          D O CHANGE_VECTOR$$                     XID$$
---------- ------------------- - - ------------------------------ ----------
         1 4000-01-01 00:00:00 I N FE                             2.8148E+15

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL 过程已成功完成。

SQL> SELECT * FROM MV_T;

        ID NAME                                  AGE
---------- ------------------------------ ----------
         1 TEST                                   18

SQL> SELECT * FROM MLOG$_T;

        ID SNAPTIME$$          D O CHANGE_VECTOR$$                     XID$$
---------- ------------------- - - ------------------------------ ----------
         1 2010-01-18 05:12:35 I N FE                             2.8148E+15

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
2010-01-18 05:13:04

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
2010-01-18 05:16:55

SQL> SELECT * FROM MLOG$_T;

未选定行

SQL> UPDATE T SET NAME = 'ABC';

已更新 1 行。

SQL> SELECT * FROM MLOG$_T;

        ID SNAPTIME$$          D O CHANGE_VECTOR$$                     XID$$
---------- ------------------- - - ------------------------------ ----------
         1 4000-01-01 00:00:00 U U 04                             2.8149E+15

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL 过程已成功完成。

SQL> SELECT * FROM MLOG$_T;

        ID SNAPTIME$$          D O CHANGE_VECTOR$$                     XID$$
---------- ------------------- - - ------------------------------ ----------
         1 2010-01-18 05:17:33 U U 04                             2.8149E+15

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
2010-01-18 05:17:46

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
2010-01-18 05:22:02

SQL> SELECT * FROM MLOG$_T;

未选定行

可以看到,物化视图日志的清除现在和物化视图的刷新没有关系,而是根据物化视图日志建立时候指定的时间间隔,每5分钟清除一次。

物化视图日志的清除语句可以在创建的时候指定,也可以通过ALTER MATERIALIZED VIEW语句进行修改,比如下面就将物化视图日志的刷新修改为默认方式,也就是和以前版本保持一致的——物化视图刷新时清除物化视图日志:

SQL> ALTER MATERIALIZED VIEW LOG ON T PURGE IMMEDIATE SYNCHRONOUS;

实体化视图日志已更改。

SQL> INSERT INTO T        
  2  VALUES (2, 'T', 1);

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> SELECT * FROM MLOG$_T;

        ID SNAPTIME$$          D O CHANGE_VECTOR$$                     XID$$
---------- ------------------- - - ------------------------------ ----------
         2 4000-01-01 00:00:00 I N FE                             1.4075E+15

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL 过程已成功完成。

SQL> SELECT * FROM MLOG$_T;

未选定行

即使是PURGE IMMEDIATE方式清除物化视图日志,Oracle也可以选择同步进行或异步进行。同步方式就是以前版本的工作方式,而异步方式Oracle会在刷新后启动一个SHEDULER JOB来完成日志的清除,这种方式同样可以提高物化视图刷新的性能。

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-629542/ ,如需转载,请注明出处,否则将追究法律责任。

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

注册时间:2007-12-29

  • 博文量
    1964
  • 访问量
    11076238