我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

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

上一篇 / 下一篇  2008-05-29 23:50:30 / 个人分类:ORACLE

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

 

 

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

SQL> CREATE TABLE T
]*V*E{0C-B8s,G0  2  (
wJ&d)SYCU0J0  3   ID NUMBER,
RCIn)h jsD0  4   NAME VARCHAR2(30),
u%uq@k,B2Uo|?Y~#N0  5   CONSTRAINT PK_T PRIMARY KEY (ID)ITPUB个人空间 qLz0Q,Y7A m
  6  )ITPUB个人空间7D5Rn(Gy(X$s9Y`1n
  7  PARTITION BY RANGE (ID)
Z$XOS_"U]0  8  (ITPUB个人空间0Nh~3Q*c8tL;}
  9  PARTITION P1 VALUES LESS THAN (100),
4|XE4V-M*u3Cy0 10  PARTITION P2 VALUES LESS THAN (200),
,tA8^0Ea)H0 11  PARTITION P3 VALUES LESS THAN (MAXVALUE)ITPUB个人空间bu4C`PL J
 12  );

表已创建。

SQL> CREATE MATERIALIZED VIEW MV_T REFRESH FAST AS
HG*Aj'aJ8Q?0  2  SELECT * FROM T;ITPUB个人空间mg F"s.x`M$Q
SELECT * FROM T
/AHJg({*[|$@,u}0              *ITPUB个人空间*BL%d4Q0i$Y4K
2行出现错误:
&h)A$s0g#aP:tW0ORA-23413:
"TEST"."T"不带实体化视图日志

ITPUB个人空间am;~6JfxuOt
SQL> SELECT * FROM V$VERSION;

BANNER
lj G A)K;tF7o0----------------------------------------------------------------ITPUB个人空间bfv[8}W\$|
Oracle9i Enterprise Edition Release9.2.0.4.0 - 64bit
Production
8ft*n Jd!g(Qw6v"Mu0PL
/SQL Release 9.2.0.4.0 - Production
W\c6F e&_k N0CORE    9.2.0.3.0       ProductionITPUB个人空间!U@8gVj5z
TNS for Linux: Version 9.2.0.4.0 - ProductionITPUB个人空间 FmH;?,Zc1Xi
NLSRTL Version 9.2.0.4.0 - Production

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

SQL> CONN YANGTK/YANGTK@YTK
Ti"^G Xnw0
已连接。
5b8J3B*FniWU0SQL> SELECT * FROM V$VERSION;

BANNER
5Lg B"H CT6t0----------------------------------------------------------------
LLgn7@5yV0@2w0Oracle Database10gEnterprise Edition Release10.2.0.3.0 - Prod
5\2|6~@D)p3N-N0PL/SQL Release 10.2.0.3.0 - Production
XxU [FG%L"_$D0CORE    10.2.0.3.0      ProductionITPUB个人空间/t;\Qc4l/@
TNS for 32-bit Windows: Version 10.2.0.3.0 - Production
EMo)YwzD0NLSRTL Version 10.2.0.3.0 - Production

SQL> CREATE TABLE TITPUB个人空间{jta P0U-X
  2  (ITPUB个人空间 e!v(Vt5QFj
  3   ID NUMBER,ITPUB个人空间o;t#eph d
  4   NAME VARCHAR2(30),
r L M8I-mk0  5   CONSTRAINT PK_T PRIMARY KEY (ID)ITPUB个人空间}}p:i Pj{2a$t-d
  6  )ITPUB个人空间MR8AuH{8N
  7  PARTITION BY RANGE (ID)
,J m,wp]*uc0  8  (
^&m6Q G'K b*HP"PyO0  9  PARTITION P1 VALUES LESS THAN (100),
#ht:{Gx @0 10  PARTITION P2 VALUES LESS THAN (200),
wv1t;Aa2E k)q0 11  PARTITION P3 VALUES LESS THAN (MAXVALUE)ITPUB个人空间 z'e6vl(G I
 12  );

表已创建。

SQL> CREATE MATERIALIZED VIEW MV_T REFRESH FAST AS
*}q9D_#QWZ~Lc0  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
M oz:K-w0  2  FROM MV_CAPABILITIES_TABLE;

CAPABILITY_NAME                P MSGTXTITPUB个人空间CZt9?-y8~
------------------------------ - ---------------------------------------------
&N Ij i.V|2Z"O4An9J|0PCT                            Y
jp `9I.u2A|0REFRESH_COMPLETE               YITPUB个人空间 c2a1@/Jo]4PZ}#q
REFRESH_FAST                   YITPUB个人空间^ r{I`1c4M4X9K
REWRITE                        YITPUB个人空间(Z(f'r2\;m2R-WE6r R ?
PCT_TABLE                      YITPUB个人空间"Z F.i~O nL c
REFRESH_FAST_AFTER_INSERT      N
详细信息表没有实体化视图日志ITPUB个人空间?:BV{4j
REFRESH_FAST_AFTER_ONETAB_DML  N
查看禁用REFRESH_FAST_AFTER_INSERT的原因
Ak+q\^,AGbU+H-F0REFRESH_FAST_AFTER_ANY_DML     N
查看禁用REFRESH_FAST_AFTER_ONETAB_DML的原因
(bG0F)NY%wi`.?0REFRESH_FAST_PCT               Y
1xmf5\ Ot _K0REWRITE_FULL_TEXT_MATCH        Y
~j h!g f|5W0REWRITE_PARTIAL_TEXT_MATCH     Y
9`4zfb&T3|7_a0REWRITE_GENERAL                YITPUB个人空间q,z+q}&~8K)N
REWRITE_PCT                    Y
^Ikv K:WkYK0PCT_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(*)
5r%B@?:uu0----------ITPUB个人空间,s6N Dq0f7b)Z
     50691

SQL> SELECT COUNT(*) FROM MV_T;

  COUNT(*)ITPUB个人空间Qkd$})b D
----------ITPUB个人空间2v1{YFk)g(I$e u cB
     50691

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

SQL> DELETE T WHERE ID = 1;

已删除1行。

SQL> SET TIMING ON
Ga.d9Qc"PS0SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL过程已成功完成。

已用时间:  00: 00: 00.09
OB0C!l6\ Yd#^0SQL> SELECT COUNT(*) FROM T;

  COUNT(*)ITPUB个人空间k#k] ZJ)I-N
----------
JW.p(|-r0     50690

已用时间:  00: 00: 00.06ITPUB个人空间N!K@)[j4M A
SQL> SELECT COUNT(*) FROM MV_T;

  COUNT(*)ITPUB个人空间I+}0](a'XRAw
----------ITPUB个人空间J K:r,P zT hl
     50690

已用时间:  00: 00: 00.06
m S/{?(KB5v/n0SQL> DELETE T WHERE ID = 10000;

已删除1行。

已用时间:  00: 00: 00.03
fP9bUv^-H0SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL过程已成功完成。

已用时间:  00: 00: 06.01
8B D%h5SlG+bY#y\ o0SQL> SELECT COUNT(*) FROM T;

  COUNT(*)
@1]*`WT6g G3|0----------
!GB+@7KH6yH9up0     50689

已用时间:  00: 00: 00.04ITPUB个人空间zkG0B N4o
SQL> SELECT COUNT(*) FROM MV_T;

  COUNT(*)ITPUB个人空间Yls6Na^H
----------ITPUB个人空间O-[$i U#B q^Y
     50689

已用时间:  00: 00: 00.06

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

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

SQL> SELECT MVIEW_NAME, REFRESH_METHOD, FAST_REFRESHABLE, LAST_REFRESH_TYPE
1q-c7Juw }tIO0  2  FROM USER_MVIEWS
I+K ?9n;S8sK'i0  3  WHERE MVIEW_NAME = 'MV_T';

MVIEW_NAME                     REFRESH_ FAST_REFRESHABLE   LAST_REFITPUB个人空间.[@%Jj'w)[i7r
------------------------------ -------- ------------------ --------
ueG(wMA0MV_T                           FAST     DML                FAST_PCT

已用时间:  00: 00: 00.06ITPUB个人空间M3\6a&o2EP
SQL> CREATE MATERIALIZED VIEW LOG ON T;

实体化视图日志已创建。

已用时间:  00: 00: 00.20
~ ]s#aGfK{0SQL> DELETE T WHERE ID = 10001;

已删除1行。

已用时间:  00: 00: 00.04
xT y wY.l0SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL过程已成功完成。

已用时间:  00: 00: 03.64
~${ BzdBIH|0SQL> SELECT MVIEW_NAME, REFRESH_METHOD, FAST_REFRESHABLE, LAST_REFRESH_TYPEITPUB个人空间zJ@:z)M$RZ7V a
  2  FROM USER_MVIEWS
&J:p"uUd,O0  3  WHERE MVIEW_NAME = 'MV_T';

MVIEW_NAME                     REFRESH_ FAST_REFRESHABLE   LAST_REFITPUB个人空间\ UIVal:Z
------------------------------ -------- ------------------ --------ITPUB个人空间 G ?~[;o&a|
MV_T                           FAST     DML                FAST_PCT

已用时间:  00: 00: 00.04
s;S0y,k4Q F0SQL> DELETE T WHERE ID = 10002;

已删除1行。

已用时间:  00: 00: 00.04
!d+`@a){0SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL过程已成功完成。

已用时间:  00: 00: 00.25ITPUB个人空间 _@jijx
SQL> SELECT MVIEW_NAME, REFRESH_METHOD, FAST_REFRESHABLE, LAST_REFRESH_TYPEITPUB个人空间$x rwZ|
  2  FROM USER_MVIEWSITPUB个人空间dy'p\f pM;v)]
  3  WHERE MVIEW_NAME = 'MV_T';

MVIEW_NAME                     REFRESH_ FAST_REFRESHABLE   LAST_REF
*O&w0b xWp0------------------------------ -------- ------------------ --------
9SWu,}5TvB0MV_T                           FAST     DML                FAST

已用时间:  00: 00: 00.04

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

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar