1 疑问点

这里引用p2处的一段话:

自己通过实验可以发现,在11.2.0.4.0版本中,这里的说法其实有一些问题的,大师也会犯错。

2 实验验证

2.1 实验环境

11.2.0.4.0

2.2 创建统一区大小管理表空间

2.2.1 统一区大小40k

我们知道,区大小的管理有系统管理(默认)和统一区大小管理(这里使用)两种模式。

SYS@zkm1> create tablespace tbs1 datafile '+arch' autoextend on uniform size 40k;

Tablespace created.

SYS@zkm1> create user zkm identified by oracle default tablespace tbs1;

User created.

SYS@zkm1> grant dba to zkm;

Grant succeeded.

SYS@zkm1> create table zkm.test as select rownum id from dual where rownum=1; -- 避免延迟段创建的影响

Table created.

SYS@zkm1> select header_file,header_block from dba_segments where segment_name='TEST' and owner='ZKM';

HEADER_FILE HEADER_BLOCK
----------- ------------
6 10 SYS@zkm1> select EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS from dba_extents where owner='ZKM' and SEGMENT_NAME='TEST'; EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
---------- ---------- ---------- ---------- ----------
0 6 8 40960 5

可以得到如下信息(BMB信息dump可验证):

  1. 段头块是6号文件第10个块,也是一个L3块
  2. 区0是从第8个块开始,这个块其实是一个L1块
  3. 第9个块是L2块,11-12这两个块则是可以实际使用的数据块

这里可以看出,这跟VAGE大师的说法(开头处引用)有点出入。应该是0~7这8个块是文件头才对(和10g类似)。

继续。

2.2.2 统一区大小56k

SYS@zkm1> drop tablespace tbs1 including contents and datafiles;

Tablespace dropped.

SYS@zkm1> create tablespace tbs1 datafile '+arch' size 1g autoextend on uniform size 56k;

Tablespace created.

SYS@zkm1> create table zkm.test as select rownum id from dual where rownum=1;

Table created.

SYS@zkm1> select header_file,header_block from dba_segments where segment_name='TEST' and owner='ZKM';

HEADER_FILE HEADER_BLOCK
----------- ------------
6 10 SYS@zkm1>
SYS@zkm1> select EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS from dba_extents where owner='ZKM' and SEGMENT_NAME='TEST'; EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
---------- ---------- ---------- ---------- ----------
0 6 8 57344 7

继续。

2.2.3 统一区大小64k

相同的执行语句。

SYS@zkm1> drop tablespace tbs1 including contents and datafiles;

Tablespace dropped.

SYS@zkm1> create tablespace tbs1 datafile '+arch' autoextend on uniform size 64k;

Tablespace created.

SYS@zkm1> create table zkm.test as select rownum id from dual where rownum=1;

Table created.

SYS@zkm1> select header_file,header_block from dba_segments where segment_name='TEST' and owner='ZKM';

HEADER_FILE HEADER_BLOCK
----------- ------------
6 130 SYS@zkm1> select EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS from dba_extents where owner='ZKM' and SEGMENT_NAME='TEST'; EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
---------- ---------- ---------- ---------- ----------
0 6 128 65536 8

创建64k统一区大小的话,似乎是符合开头引用那段话的内容的,区从128号块开始,0~127共128个块是文件头。

事实上,系统管理区大小的表空间,默认段开始的16个区,都是8个块,块大小8k,刚好一个区64k。

2.2.4 统一区大小64M

SYS@zkm1> drop tablespace tbs1 including contents and datafiles;

Tablespace dropped.

SYS@zkm1> create tablespace tbs1 datafile '+arch' autoextend on uniform size 64M;

Tablespace created.

SYS@zkm1> create table zkm.test as select rownum id from dual where rownum=1;

Table created.

SYS@zkm1> select header_file,header_block from dba_segments where segment_name='TEST' and owner='ZKM';

HEADER_FILE HEADER_BLOCK
----------- ------------
6 161 SYS@zkm1> select EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS from dba_extents where owner='ZKM' and SEGMENT_NAME='TEST'; EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
---------- ---------- ---------- ---------- ----------
0 6 128 67108864 8192

事实上,分别设置统一区大小管理为64M,128M,256M,1024M,发现区都是从128号块开始了,符合这种说法了。

只不过,随着区越来越大,L3(段头块)的编号越大。

那么,基于11.2.0.4.0实验可得到的结论:在区大小超过64k之后,大师的说法是对的,小于64k的情况下,还是遵循10g的模式

05-07 15:37