最近发现Oracle中不少SQL使用了 update /* append */ 语句,这种使用方式我从来没见过。由于Oracle对于无效的hint不会报错,所以无法得知这个Hint是否生效。只好通过dump实验来核实使用update /* append */ 语句的hint是否生效。
实验准备:
建立一个测试表,本例中为SCOTT.TEST_2013。
create table SCOTT.TEST_2013 as select * from dba_objects;
实验步骤:
1.开启一个新session。
2.输入并执行测试语句,并commit。
3.刷新buffer cache
alter system flush buffer_cache;
4.查询测试表的段头
select header_file,header_block from dba_segments where segment_name='TEST_2013' and owner='SCOTT';
HEADER_FILE HEADER_BLOCK
----------- ------------
6 814355
5.dump段头block
alter system dump datafile 6 block 814355;
6.查询生成的trace文件路径
实验有一个观察组,两个对照组。
观察组A使用的测试语句为 update /* append */ SCOTT.TEST_2013 set object_name = 'a' where object_id = 100;
对照组B使用的测试语句为 update SCOTT.TEST_2013 set object_name = 'test' where object_id = 100;
对照组C使用的测试语句为 insert /* append */ into SCOTT.TEST_2013 select * from SCOTT.TEST_2013 where rownum <= 1;
A组生成的trace文件中,关于HMW的部分内容为
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 16 #blocks: 128
last map 0x00000000 #maps: 0 offset: 2716
Highwater:: 0x018cba0f ext#: 15 blk#: 6 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 126
mapblk 0x00000000 offset: 15
Unlocked
--------------------------------------------------------
Low HighWater Mark :
Highwater:: 0x018cba0f ext#: 15 blk#: 6 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 126
mapblk 0x00000000 offset: 15
Level 1 BMB for High HWM block: 0x018c6d81
Level 1 BMB for Low HWM block: 0x018c6d81
--------------------------------------------------------
B组生成的trace文件中,关于HMW的部分内容为
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 16 #blocks: 128
last map 0x00000000 #maps: 0 offset: 2716
Highwater:: 0x018cba0f ext#: 15 blk#: 6 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 126
mapblk 0x00000000 offset: 15
Unlocked
--------------------------------------------------------
Low HighWater Mark :
Highwater:: 0x018cba0f ext#: 15 blk#: 6 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 126
mapblk 0x00000000 offset: 15
Level 1 BMB for High HWM block: 0x018c6d81
Level 1 BMB for Low HWM block: 0x018c6d81
--------------------------------------------------------
C组生成的trace文件中,关于HMW的部分内容为
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 16 #blocks: 128
last map 0x00000000 #maps: 0 offset: 2716
Highwater:: 0x018cba11 ext#: 15 blk#: 8 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 128
mapblk 0x00000000 offset: 15
Unlocked
--------------------------------------------------------
Low HighWater Mark :
Highwater:: 0x018cba11 ext#: 15 blk#: 8 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 128
mapblk 0x00000000 offset: 15
Level 1 BMB for High HWM block: 0x018c6d81
Level 1 BMB for Low HWM block: 0x018c6d81
--------------------------------------------------------
此这3个trace文件可以看到,A和B的HWM都在0x018cba0f,且在HWM之下有126个block,而在C组中,HWM都在0x018cba11,且在HWM之下有128个block,block号由6号变为8号。
也就是说,update /* append */ 的效果和普通update是一样的,即append的hint没有生效。
阅读(1625) | 评论(0) | 转发(0) |