首页 > Linux操作系统 > Linux操作系统 > 高水标记的研究(2)
本文重点关注在insert时高水标记的变化规律
构造一个表,每插入一条记录就增加一块
SQL> create table test(x int,y varchar2(1200),z varchar2(1200))
2 pctfree 70,pctused 20;
表已创建。
每插入一条记录,dump一次段头的块
SQL> insert into test values(1,lpad('a',1200),lpad('a',1200));
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system dump datafile 15 block 9;
系统已更改。
连续以上操作17次,插入17条记录。可以看出每行记录占用了1 block
SQL> @table_blocks;
输入 table 的值: test
原值 4: from &table) group by f,b
新值 4: from test) group by f,b
F B COUNT(*)
---------- ---------- ----------
15 10 1
15 11 1
15 12 1
15 13 1
15 14 1
15 15 1
15 16 1
15 17 1
15 18 1
15 19 1
15 20 1
15 21 1
15 22 1
15 23 1
15 24 1
15 25 1
15 26 1
已选择17行。
在dump文件中搜索Highwater,显示了每次dump的高水标记信息
Highwater:: 0x03c0000b ext#: 0 blk#: 1 ext size: 7
Highwater:: 0x03c0000c ext#: 0 blk#: 2 ext size: 7
Highwater:: 0x03c0000d ext#: 0 blk#: 3 ext size: 7
Highwater:: 0x03c0000e ext#: 0 blk#: 4 ext size: 7
Highwater:: 0x03c0000f ext#: 0 blk#: 5 ext size: 7
Highwater:: 0x03c00011 ext#: 0 blk#: 7 ext size: 7
Highwater:: 0x03c00011 ext#: 0 blk#: 7 ext size: 7
Highwater:: 0x03c00016 ext#: 1 blk#: 5 ext size: 8
Highwater:: 0x03c00016 ext#: 1 blk#: 5 ext size: 8
Highwater:: 0x03c00016 ext#: 1 blk#: 5 ext size: 8
Highwater:: 0x03c00016 ext#: 1 blk#: 5 ext size: 8
Highwater:: 0x03c00016 ext#: 1 blk#: 5 ext size: 8
Highwater:: 0x03c00019 ext#: 1 blk#: 8 ext size: 8
Highwater:: 0x03c00019 ext#: 1 blk#: 8 ext size: 8
Highwater:: 0x03c00019 ext#: 1 blk#: 8 ext size: 8
Highwater:: 0x03c0001e ext#: 2 blk#: 5 ext size: 8
Highwater:: 0x03c0001e ext#: 2 blk#: 5 ext size: 8
把地址转下,高水标记的变化如下:
看上去非常没有规律
我做了以下的猜想:
1 concept上说过,extent最少要保证有5块,所以前5块被分配时,高水标记记录当前data block的next block。
SQL> select t.tablespace_name,t.allocation_type from dba_tablespaces t where t
.tablespace_name='YANG';
TABLESPACE_NAME ALLOCATIO
------------------------------ ---------
YANG SYSTEM
SQL> select t.blocks from dba_extents t where t.owner='YANG' and t.segment_name
='TEST';
BLOCKS
----------
8
8
8
该表的表空间的allocation_type为System自动分配,造成刚开始时1extent = 8block
所以分配第6个block时,如果高水标记增加5个block将会超过当前extent的last block,所以高水标记记录当前extent的最后一个block的next block。
3 第一个extent上的block使用完,需要分配下一个extent时,高水标记记录增加了5个block
4 开始分配22块时,高水标记记录当前extent(第二个extent)的最后一个block的next block
5 第二个extent上的block使用完,分配第三个extent,高水标记记录增加5个block
使用uniform的extent来验证以上的猜想
创建一个uniform. size 112k的表空间,112k=14 block
CREATE TABLESPACE "YANG2"
LOGGING
DATAFILE 'D:\ORACLE\ORADATA\GAME\YANG2.ORA' SIZE 5M REUSE
EXTENT MANAGEMENT LOCAL UNIFORM. SIZE 112K SEGMENT SPACE
MANAGEMENT MANUAL
SQL> CREATE TABLE "YANG"."TEST2" ("X" NUMBER(10) NOT NULL, "Y"
2 VARCHAR2(1200) NOT NULL, "Z" VARCHAR2(1200) NOT NULL)
3 TABLESPACE "YANG2" PCTFREE 70 PCTUSED 20 ;
表已创建。
SQL> insert into test2 values(1,lpad('a',1200),lpad('a',1200));
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system dump datafile 16 block 9;
系统已更改。
连续操作插入14条记录
在dump文件中搜索Highwater,显示了每次dump的高水标记信息
Highwater:: 0x0400000b ext#: 0 blk#: 1 ext size: 13
Highwater:: 0x0400000c ext#: 0 blk#: 2 ext size: 13
Highwater:: 0x0400000d ext#: 0 blk#: 3 ext size: 13
Highwater:: 0x0400000e ext#: 0 blk#: 4 ext size: 13
Highwater:: 0x0400000f ext#: 0 blk#: 5 ext size: 13
Highwater:: 0x04000014 ext#: 0 blk#: 10 ext size: 13
Highwater:: 0x04000014 ext#: 0 blk#: 10 ext size: 13
Highwater:: 0x04000014 ext#: 0 blk#: 10 ext size: 13
Highwater:: 0x04000014 ext#: 0 blk#: 10 ext size: 13
Highwater:: 0x04000014 ext#: 0 blk#: 10 ext size: 13
Highwater:: 0x04000017 ext#: 0 blk#: 13 ext size: 13
Highwater:: 0x04000017 ext#: 0 blk#: 13 ext size: 13
Highwater:: 0x04000017 ext#: 0 blk#: 13 ext size: 13
Highwater:: 0x0400001c ext#: 1 blk#: 5 ext size: 14
注意从0x0400000f变化到0x04000014,高水标记增加5个block并没有超过当前extent(14个block)的last block,所以高水标记记录 0x04000014。
从0x04000014变化到0x04000017,高水标记增加5个block超过了当前extent (14个block)的last block,
所以高水标记记录0x04000017
终于明白了高水标记是如何变化的,但这些变化都是在手动段空间管理中
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22111412/viewspace-614170/ ,如需转载,请注明出处,否则将追究法律责任。