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

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

研究PCT快速刷新的机制。

上一篇通过TRACE文件的分析,确认了PCT快速刷新是刷新单位是分区。不过现在仍然存在一个问题,对于物化视图日志方式的快速刷新,Oracle通过内部触发器,在基表进行DML操作的同时在物化视图日志上记录操作信息,快速刷新的时候根据物化视图日志上面的DML信息,配合基表就可以实现刷新了。

但是PCT快速刷新不需要物化视图日志,也就是说,没有通过额外的机制来记录基表的变化,那么Oracle是如何知道哪些分区发生了变化,哪些分区是不需要进行刷新的呢。

这个疑问看来仍然需要通过TRACE来解决,这里仍然分析上一篇文章例子中做的TRACE文件:

PARSING IN CURSOR #16 len=430 dep=1 uid=0 oct=3 lid=0 tim=50229970671 hv=860000844 ad='27e873c0'

SELECT tname, snapid, flag, flag2, status, master_version, tables, lobmaskvec, query_len, mas_roll_seg, mlink, snapshot, auto_fun, uslog, NVL(rscn, 0), refhnt, objflag, auto_fast, sna_type_oid, sna_type_hashcode, sna_type_owner, sna_type_name, mas_type_oid, mas_type_hashcode, mas_type_owner, mas_type_name, syn_count FROM sys.snap$ WHERE sowner = :1 and vname = :2 and instsite = :3

END OF STMT

PARSE #16:c=0,e=705,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=50229970663

BINDS #31:

kkscoacd

Bind#0

oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00

oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0

kxsbbbfp=086d7b9c bln=22 avl=03 flg=05

value=212

Bind#1

oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00

oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0

kxsbbbfp=086d7b78 bln=24 avl=02 flg=05

value=29

=====================

.

.

.

=====================

PARSING IN CURSOR #31 len=210 dep=2 uid=0 oct=3 lid=0 tim=50229975777 hv=864012087 ad='3364435c'

select /*+ rule */ bucket_cnt, row_cnt, cache_cnt, null_cnt, timestamp#, sample_size, minimum, maximum, distcnt, lowval, hival, density, col#, spare1, spare2, avgcln from hist_head$ where obj#=:1 and intcol#=:2

END OF STMT

EXEC #31:c=0,e=129,p=0,cr=0,cu=0,mis=0,r=0,dep=2,og=3,tim=50229975772

FETCH #31:c=0,e=47,p=0,cr=3,cu=0,mis=0,r=1,dep=2,og=3,tim=50229975874

STAT #31 id=1 cnt=115 pid=0 pos=1 obj=255 op='TABLE ACCESS BY INDEX ROWID HIST_HEAD$ (cr=353 pr=2 pw=0 time=29119 us)'

STAT #31 id=2 cnt=115 pid=1 pos=1 obj=257 op='INDEX RANGE SCAN I_HH_OBJ#_INTCOL# (cr=238 pr=1 pw=0 time=11936 us)'

BINDS #16:

kkscoacd

Bind#0

oacdty=01 mxl=32(06) mxlc=00 mal=00 scl=00 pre=00

oacflg=10 fl2=0001 frm=01 csi=852 siz=88 off=0

kxsbbbfp=04d7dbb4 bln=32 avl=06 flg=05

value="YANGTK"

Bind#1

oacdty=01 mxl=32(04) mxlc=00 mal=00 scl=00 pre=00

oacflg=10 fl2=0001 frm=01 csi=852 siz=0 off=32

kxsbbbfp=04d7dbd4 bln=32 avl=04 flg=01

value="MV_T"

Bind#2

oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00

oacflg=00 fl2=0001 frm=00 csi=00 siz=0 off=64

kxsbbbfp=04d7dbf4 bln=22 avl=01 flg=01

value=0

EXEC #16:c=15625,e=5674,p=0,cr=39,cu=0,mis=1,r=0,dep=1,og=4,tim=50229976479

FETCH #16:c=0,e=65,p=0,cr=2,cu=0,mis=0,r=1,dep=1,og=4,tim=50229976571

STAT #16 id=1 cnt=1 pid=0 pos=1 obj=212 op='TABLE ACCESS BY INDEX ROWID SNAP$ (cr=2 pr=0 pw=0 time=63 us)'

STAT #16 id=2 cnt=1 pid=1 pos=1 obj=217 op='INDEX UNIQUE SCAN I_SNAP1 (cr=1 pr=0 pw=0 time=27 us)'

=====================

PARSING IN CURSOR #16 len=265 dep=1 uid=0 oct=3 lid=0 tim=50229977029 hv=29191747 ad='27e85394'

SELECT masobj#, masflag, mowner, master, lastsuccess, snaptime, sysdate, loadertime, sysdate, NVL(refscn, 0), fcmaskvec, ejmaskvec, sub_handle, change_view FROM sys.snap_reftime$ WHERE sowner = :1 AND vname = :2 AND instsite = :3 ORDER BY tablenum

END OF STMT

PARSE #16:c=0,e=343,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=50229977022

BINDS #23:

kkscoacd

Bind#0

oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00

oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0

kxsbbbfp=086d7b9c bln=22 avl=03 flg=05

value=220

Bind#1

oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00

oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0

kxsbbbfp=086d7b78 bln=24 avl=02 flg=05

value=7

=====================

.

.

.

=====================

PARSING IN CURSOR #20 len=210 dep=2 uid=0 oct=3 lid=0 tim=50229980422 hv=864012087 ad='3364435c'

select /*+ rule */ bucket_cnt, row_cnt, cache_cnt, null_cnt, timestamp#, sample_size, minimum, maximum, distcnt, lowval, hival, density, col#, spare1, spare2, avgcln from hist_head$ where obj#=:1 and intcol#=:2

END OF STMT

EXEC #20:c=0,e=134,p=0,cr=0,cu=0,mis=0,r=0,dep=2,og=3,tim=50229980416

FETCH #20:c=0,e=46,p=0,cr=3,cu=0,mis=0,r=1,dep=2,og=3,tim=50229980518

STAT #20 id=1 cnt=124 pid=0 pos=1 obj=255 op='TABLE ACCESS BY INDEX ROWID HIST_HEAD$ (cr=381 pr=2 pw=0 time=29603 us)'

STAT #20 id=2 cnt=124 pid=1 pos=1 obj=257 op='INDEX RANGE SCAN I_HH_OBJ#_INTCOL# (cr=256 pr=1 pw=0 time=12127 us)'

BINDS #16:

kkscoacd

Bind#0

oacdty=01 mxl=32(06) mxlc=00 mal=00 scl=00 pre=00

oacflg=10 fl2=0001 frm=01 csi=852 siz=88 off=0

kxsbbbfp=04d7dbb4 bln=32 avl=06 flg=05

value="YANGTK"

Bind#1

oacdty=01 mxl=32(04) mxlc=00 mal=00 scl=00 pre=00

oacflg=10 fl2=0001 frm=01 csi=852 siz=0 off=32

kxsbbbfp=04d7dbd4 bln=32 avl=04 flg=01

value="MV_T"

Bind#2

oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00

oacflg=00 fl2=0001 frm=00 csi=00 siz=0 off=64

kxsbbbfp=04d7dbf4 bln=22 avl=01 flg=01

value=0

EXEC #16:c=0,e=4175,p=0,cr=28,cu=0,mis=1,r=0,dep=1,og=4,tim=50229981265

FETCH #16:c=0,e=62,p=0,cr=2,cu=0,mis=0,r=1,dep=1,og=4,tim=50229981357

=====================

上面的这两个SQL不但获取了物化视图的一些基本信息,还获取了物化视图上次刷新的SCN信息。

=====================

PARSING IN CURSOR #25 len=71 dep=1 uid=0 oct=3 lid=0 tim=50230015976 hv=3754315372 ad='27e81d6c'

select nvl(max(spare1),0) from tabpart$ where bo# = :1 and spare1 <= :2

END OF STMT

PARSE #25:c=0,e=576,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=50230015967

BINDS #25:

kkscoacd

Bind#0

oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00

oacflg=00 fl2=0001 frm=00 csi=00 siz=48 off=0

kxsbbbfp=079962d0 bln=22 avl=04 flg=05

value=56624

Bind#1

oacdty=02 mxl=22(06) mxlc=00 mal=00 scl=00 pre=00

oacflg=10 fl2=0001 frm=01 csi=00 siz=0 off=24

kxsbbbfp=079962e8 bln=22 avl=06 flg=01

value=6050226572

EXEC #25:c=0,e=655,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=50230016695

FETCH #25:c=0,e=101,p=0,cr=2,cu=0,mis=0,r=1,dep=1,og=4,tim=50230016824

STAT #25 id=1 cnt=1 pid=0 pos=1 obj=0 op='SORT AGGREGATE (cr=2 pr=0 pw=0 time=119 us)'

STAT #25 id=2 cnt=1 pid=1 pos=1 obj=266 op='TABLE ACCESS BY INDEX ROWID TABPART$ (cr=2 pr=0 pw=0 time=79 us)'

STAT #25 id=3 cnt=3 pid=2 pos=1 obj=269 op='INDEX RANGE SCAN I_TABPART_BOPART$ (cr=1 pr=0 pw=0 time=36 us)'

=====================

这个SQL读取分区表的最大SCN信息。

SQL> CONN YANGTK/YANGTK@YTK102已连接。SQL> alter index pk_t rebuild;

索引已更改。

SQL> INSERT INTO T VALUES (150, 'A');

已创建1行。

SQL> COMMIT;

提交完成。

SQL> DELETE T PARTITION (P3) WHERE ROWNUM = 1;

已删除1行。

SQL> COMMIT;

提交完成。

下面切换回SYS用户,检查TABPART$表:

SQL> CONN / AS SYSDBA已连接。SQL> SELECT SPARE1 from tabpart$ where bo# = 56624 ;

SPARE1

----------

6050256635

6050256782

由于刚才分别对分区P2和分区P3进行了操作,因此TABPART$中可以看到这两个分区的SPARE1列记录了SCN的值,看到这里已经可以推断出,Oracle是根据分区的SCN是否大于上次刷新的SCN来判断这个分区是否需要进行PCT刷新。

=====================

PARSING IN CURSOR #24 len=374 dep=2 uid=0 oct=3 lid=0 tim=50230096308 hv=236422262 ad='27e7e7dc'

select distinct tp1.obj#, tp1.part# from (select tp.obj#, tp.part# from tabpart$ tp where tp.bo# = :dobj# and tp.spare1 > :lscn union select /*+ ordered use_hash(tp) */ tp.obj#, tp.part# from sumdelta$ s1, tabpart$ tp where tp.bo# = :dobj# and tp.dataobj# = s1.partitionobj# and s1.scn> :lscn) tp1 order by tp1.part#

END OF STMT

PARSE #24:c=0,e=1062,p=0,cr=0,cu=0,mis=1,r=0,dep=2,og=4,tim=50230096302

BINDS #25:

kkscoacd

Bind#0

oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00

oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0

kxsbbbfp=086d7b9c bln=22 avl=03 flg=05

value=157

Bind#1

oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00

oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0

kxsbbbfp=086d7b78 bln=24 avl=02 flg=05

value=2

=====================

PARSING IN CURSOR #25 len=210 dep=3 uid=0 oct=3 lid=0 tim=50230097399 hv=864012087 ad='3364435c'

select /*+ rule */ bucket_cnt, row_cnt, cache_cnt, null_cnt, timestamp#, sample_size, minimum, maximum, distcnt, lowval, hival, density, col#, spare1, spare2, avgcln from hist_head$ where obj#=:1 and intcol#=:2

END OF STMT

EXEC #25:c=15625,e=158,p=0,cr=0,cu=0,mis=0,r=0,dep=3,og=3,tim=50230097387

FETCH #25:c=0,e=40,p=0,cr=2,cu=0,mis=0,r=0,dep=3,og=3,tim=50230097497

STAT #25 id=1 cnt=129 pid=0 pos=1 obj=255 op='TABLE ACCESS BY INDEX ROWID HIST_HEAD$ (cr=404 pr=2 pw=0 time=30095 us)'

STAT #25 id=2 cnt=129 pid=1 pos=1 obj=257 op='INDEX RANGE SCAN I_HH_OBJ#_INTCOL# (cr=274 pr=1 pw=0 time=12353 us)'

BINDS #24:

kkscoacd

Bind#0

oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00

oacflg=00 fl2=0001 frm=00 csi=00 siz=48 off=0

kxsbbbfp=04d7a174 bln=22 avl=04 flg=05

value=56624

Bind#1

oacdty=02 mxl=22(06) mxlc=00 mal=00 scl=00 pre=00

oacflg=10 fl2=0001 frm=00 csi=00 siz=0 off=24

kxsbbbfp=04d7a18c bln=22 avl=06 flg=01

value=6050226324

Bind#2

No oacdef for this bind.

Bind#3

No oacdef for this bind.

EXEC #24:c=15625,e=2039,p=0,cr=2,cu=0,mis=1,r=0,dep=2,og=4,tim=50230098433

FETCH #24:c=0,e=434,p=0,cr=5,cu=0,mis=0,r=1,dep=2,og=4,tim=50230098887

FETCH #24:c=0,e=7,p=0,cr=0,cu=0,mis=0,r=0,dep=2,og=4,tim=50230098944

STAT #24 id=1 cnt=1 pid=0 pos=1 obj=0 op='SORT UNIQUE (cr=5 pr=0 pw=0 time=498 us)'

STAT #24 id=2 cnt=1 pid=1 pos=1 obj=0 op='VIEW (cr=5 pr=0 pw=0 time=457 us)'

STAT #24 id=3 cnt=1 pid=2 pos=1 obj=0 op='SORT UNIQUE (cr=5 pr=0 pw=0 time=431 us)'

STAT #24 id=4 cnt=1 pid=3 pos=1 obj=0 op='UNION-ALL (cr=5 pr=0 pw=0 time=380 us)'

STAT #24 id=5 cnt=1 pid=4 pos=1 obj=266 op='TABLE ACCESS BY INDEX ROWID TABPART$ (cr=2 pr=0 pw=0 time=74 us)'

STAT #24 id=6 cnt=3 pid=5 pos=1 obj=269 op='INDEX RANGE SCAN I_TABPART_BOPART$ (cr=1 pr=0 pw=0 time=36 us)'

STAT #24 id=7 cnt=0 pid=4 pos=2 obj=0 op='HASH JOIN (cr=3 pr=0 pw=0 time=213 us)'

STAT #24 id=8 cnt=0 pid=7 pos=1 obj=157 op='TABLE ACCESS FULL SUMDELTA$ (cr=3 pr=0 pw=0 time=48 us)'

STAT #24 id=9 cnt=0 pid=7 pos=2 obj=266 op='TABLE ACCESS BY INDEX ROWID TABPART$ (cr=0 pr=0 pw=0 time=0 us)'

STAT #24 id=10 cnt=0 pid=9 pos=1 obj=269 op='INDEX RANGE SCAN I_TABPART_BOPART$ (cr=0 pr=0 pw=0 time=0 us)'

=====================

上面的SQL确定需要进行PCT刷新的分区。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值