关于数据文件的文件头2-P2

1 疑问点

这里引用p2处的一段话:

事实上,每个文件的前128个块,都是文件头,被Oracle留用了。在Oracle 10g中是0至8号块被Oracle留用。而从Oracle 11GR2开始,一下就留用了128个块,这是大手笔,不是吗?
这一部分文件头又分两部分,其实0号、1号块是真正的文件头,2 ~ 127号块是位图块。而在Oracle10g中,2 ~ 8号块则是位图块。

自己通过实验可以发现,在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的模式

原文地址:https://www.cnblogs.com/PiscesCanon/p/12723502.html