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

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来完成日志的清除,这种方式同样可以提高物化视图刷新的性能。

yangtingkun 发表于:2010.03.15 23:58 ::分类: ( ORACLE ) ::阅读:(629次) :: 评论 (0)

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
最多评论文章...
博客统计...
Blog信息
网站链接...