10G物化视图PCT快速刷新不再需要物化视图日志(一)

Oracle10g增加了物化视图PCT快速刷新的支持,使用PCT快速刷新不再需要物化视图日志。

 

 

9i中,物化视图的快速刷新必须建立物化视图日志,否则物化视图无法快速刷新:

SQL> CREATE TABLE T
  2  (
  3   ID NUMBER,
  4   NAME VARCHAR2(30),
  5   CONSTRAINT PK_T PRIMARY KEY (ID)
  6  )
  7  PARTITION BY RANGE (ID)
  8  (
  9  PARTITION P1 VALUES LESS THAN (100),
 10  PARTITION P2 VALUES LESS THAN (200),
 11  PARTITION P3 VALUES LESS THAN (MAXVALUE)
 12  );

表已创建。

SQL> CREATE MATERIALIZED VIEW MV_T REFRESH FAST AS
  2  SELECT * FROM T;
SELECT * FROM T
              *
2 行出现错误:
ORA-23413:
"TEST"."T" 不带实体化视图日志


SQL> SELECT * FROM V$VERSION;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit
Production
PL/SQL Release 9.2.0.4.0 - Production
CORE    9.2.0.3.0       Production
TNS for Linux: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production

10g中,分区表不在需要建立物化视图日志就可以实现物化视图的快速刷新:

SQL> CONN YANGTK/YANGTK@YTK
已连接。
SQL> SELECT * FROM V$VERSION;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
PL/SQL Release 10.2.0.3.0 - Production
CORE    10.2.0.3.0      Production
TNS for 32-bit Windows: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production

SQL> CREATE TABLE T
  2  (
  3   ID NUMBER,
  4   NAME VARCHAR2(30),
  5   CONSTRAINT PK_T PRIMARY KEY (ID)
  6  )
  7  PARTITION BY RANGE (ID)
  8  (
  9  PARTITION P1 VALUES LESS THAN (100),
 10  PARTITION P2 VALUES LESS THAN (200),
 11  PARTITION P3 VALUES LESS THAN (MAXVALUE)
 12  );

表已创建。

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

实体化视图已创建。

虽然Oracle支持不建立物化视图日志,但是要注意,不建立物化视图日志的快速刷新采用的是PCT的快速刷新,而不是普通的增量刷新。

SQL> @?/RDBMS/ADMIN/UTLXMV

表已创建。

SQL> EXEC DBMS_MVIEW.EXPLAIN_MVIEW('SELECT * FROM T')

PL/SQL 过程已成功完成。

SQL> SELECT CAPABILITY_NAME, POSSIBLE, MSGTXT
  2  FROM MV_CAPABILITIES_TABLE;

CAPABILITY_NAME                P MSGTXT
------------------------------ - ---------------------------------------------
PCT                            Y
REFRESH_COMPLETE               Y
REFRESH_FAST                   Y
REWRITE                        Y
PCT_TABLE                      Y
REFRESH_FAST_AFTER_INSERT      N
详细信息表没有实体化视图日志
REFRESH_FAST_AFTER_ONETAB_DML  N
查看禁用 REFRESH_FAST_AFTER_INSERT 的原因
REFRESH_FAST_AFTER_ANY_DML     N
查看禁用 REFRESH_FAST_AFTER_ONETAB_DML 的原因
REFRESH_FAST_PCT               Y
REWRITE_FULL_TEXT_MATCH        Y
REWRITE_PARTIAL_TEXT_MATCH     Y
REWRITE_GENERAL                Y
REWRITE_PCT                    Y
PCT_TABLE_REWRITE              Y

已选择14行。

从上面的信息不难看出,物化视图支持的是PCT快速刷新,而不是增量刷新,这就意味着进行普通增量修改的刷新将花费大量的时间:

SQL> INSERT INTO T SELECT ROWNUM, OBJECT_NAME FROM DBA_OBJECTS;

已创建50691行。

SQL> COMMIT;

提交完成。

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL 过程已成功完成。

SQL> SELECT COUNT(*) FROM T;

  COUNT(*)
----------
     50691

SQL> SELECT COUNT(*) FROM MV_T;

  COUNT(*)
----------
     50691

下面对比一下删除一条记录对应的刷新时间:

SQL> DELETE T WHERE ID = 1;

已删除 1 行。

SQL> SET TIMING ON
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.09
SQL> SELECT COUNT(*) FROM T;

  COUNT(*)
----------
     50690

已用时间:  00: 00: 00.06
SQL> SELECT COUNT(*) FROM MV_T;

  COUNT(*)
----------
     50690

已用时间:  00: 00: 00.06
SQL> DELETE T WHERE ID = 10000;

已删除 1 行。

已用时间:  00: 00: 00.03
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL 过程已成功完成。

已用时间:  00: 00: 06.01
SQL> SELECT COUNT(*) FROM T;

  COUNT(*)
----------
     50689

已用时间:  00: 00: 00.04
SQL> SELECT COUNT(*) FROM MV_T;

  COUNT(*)
----------
     50689

已用时间:  00: 00: 00.06

从执行时间不难分析出,PCT刷新是针对某个分区进行的刷新,而每次刷新的应该是整个分区。由于ID1的记录所在分区数据量小,刷新速度就很快,而ID10000的记录对应的分区数据量大,因此刷新所需时间就长。

在这种情况下建立物化视图,如果建立了物化视图日志,Oracle在确认可以正常使用物化视图日志后,就会选择利用物化视图日志尽量增量刷新,下面可以对比一下两种刷新对于普通增量刷新的性能:

SQL> SELECT MVIEW_NAME, REFRESH_METHOD, FAST_REFRESHABLE, LAST_REFRESH_TYPE
  2  FROM USER_MVIEWS
  3  WHERE MVIEW_NAME = 'MV_T';

MVIEW_NAME                     REFRESH_ FAST_REFRESHABLE   LAST_REF
------------------------------ -------- ------------------ --------
MV_T                           FAST     DML                FAST_PCT

已用时间:  00: 00: 00.06
SQL> CREATE MATERIALIZED VIEW LOG ON T;

实体化视图日志已创建。

已用时间:  00: 00: 00.20
SQL> DELETE T WHERE ID = 10001;

已删除 1 行。

已用时间:  00: 00: 00.04
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL 过程已成功完成。

已用时间:  00: 00: 03.64
SQL> SELECT MVIEW_NAME, REFRESH_METHOD, FAST_REFRESHABLE, LAST_REFRESH_TYPE
  2  FROM USER_MVIEWS
  3  WHERE MVIEW_NAME = 'MV_T';

MVIEW_NAME                     REFRESH_ FAST_REFRESHABLE   LAST_REF
------------------------------ -------- ------------------ --------
MV_T                           FAST     DML                FAST_PCT

已用时间:  00: 00: 00.04
SQL> DELETE T WHERE ID = 10002;

已删除 1 行。

已用时间:  00: 00: 00.04
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.25
SQL> SELECT MVIEW_NAME, REFRESH_METHOD, FAST_REFRESHABLE, LAST_REFRESH_TYPE
  2  FROM USER_MVIEWS
  3  WHERE MVIEW_NAME = 'MV_T';

MVIEW_NAME                     REFRESH_ FAST_REFRESHABLE   LAST_REF
------------------------------ -------- ------------------ --------
MV_T                           FAST     DML                FAST

已用时间:  00: 00: 00.04

可以看到,虽然PCT刷新使得物化视图日志不在是物化视图快速刷新的必要条件,但是仍然推荐对于分区表建立物化视图日志。因为PCT刷新是针对整个分区而言,而用来进行日常增量代价要比物化视图方式大得多,最好的方法仍然是物化视图日志配合PCT来进行物化视图的快速刷新。

 

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

转载于:http://blog.itpub.net/4227/viewspace-324336/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值