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可验证):
- 段头块是6号文件第10个块,也是一个L3块
- 区0是从第8个块开始,这个块其实是一个L1块
- 第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的模式。