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刷新是针对某个分区进行的刷新,而每次刷新的应该是整个分区。由于ID为1的记录所在分区数据量小,刷新速度就很快,而ID为10000的记录对应的分区数据量大,因此刷新所需时间就长。
在这种情况下建立物化视图,如果建立了物化视图日志,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/