通常数据文件头占用8个数据块,文件头 + 位图信息, 存储extent的位图信息,1为used,0为空闲;
创建1个表空间,包含一个50M的数据文件,采用uniform size 1M;
Dump数据文件头
Block 1 (file header) not dumped: use dump file header command
buffer tsn: 58 rdba: 0x09800002 (38/2)
scn: 0x085f.41ff5a0a seq: 0x01 flg: 0x04 tail: 0x5a0a1d01
frmt: 0x02 chkval: 0x53bd type: 0x1d=KTFB Bitmapped File Space Header
File Space Header Block:
Header Control:
RelFno: 38, Unit: 128, Size: 6400, Flag: 1 –Unit 一个extent包含块数,创建时指定了 uniform size 1M;Size—文件的块数;
AutoExtend: NO, Increment: 0, MaxSize: 0
Initial Area: 7, Tail: 6280, First: 0, Free: 49 initial area—位图块数;Tail—last useful block;first—搜索空间的起点;free—本文件能容纳的extent数量
Deallocation scn: 1107253768.2143
Header Opcode:
Save: No Pending Op
注:文件总计6400个块,除去8个元数据块,剩余6392,但只能创建49个extent,则有6392 - 49*128 =120个块被浪费;
buffer tsn: 58 rdba: 0x09800003 (38/3)
scn: 0x085f.41ff5a0a seq: 0x01 flg: 0x04 tail: 0x5a0a1e01
frmt: 0x02 chkval: 0xb9ab type: 0x1e=KTFB Bitmapped File Space Bitmap
Hex dump of block: st=0, typ_found=1
File Space Bitmap Block:
BitMap Control:
RelFno: 38, BeginBlock: 9, Flag: 0, First: 0, Free: 63488 beginBlock— 第1个bit代表的块号;first—搜索空闲空间的起点;free—位图中空闲bit数量
0000000000000000 0000000000000000 0000000000000000 0000000000000000
1个bit代表1个extent,即128个块,一个位图保护63488个bit,则能描述63488*128=8126464个块,又因为从9号块做起点;
故下一个位图块的起始块号=8126464 + 9 = 8126473
下面创建1个table create table t (id number(10));
buffer tsn: 58 rdba: 0x09800002 (38/2)
scn: 0x085f.4200f15d seq: 0x02 flg: 0x04 tail: 0xf15d1d02
frmt: 0x02 chkval: 0x5341 type: 0x1d=KTFB Bitmapped File Space Header
File Space Header Block:
Header Control:
RelFno: 38, Unit: 128, Size: 6400, Flag: 1
AutoExtend: NO, Increment: 0, MaxSize: 0
Initial Area: 7, Tail: 6280, First: 1, Free: 48 --新分配1个extent,此时free减1变为48
Deallocation scn: 1107253768.2143
Header Opcode:
Save: No Pending Op
buffer tsn: 58 rdba: 0x09800003 (38/3)
scn: 0x085f.4200f15d seq: 0x01 flg: 0x04 tail: 0xf15d1e01
frmt: 0x02 chkval: 0xb4aa type: 0x1e=KTFB Bitmapped File Space Bitmap
File Space Bitmap Block:
BitMap Control:
RelFno: 38, BeginBlock: 9, Flag: 0, First: 1, Free: 63487
0100000000000000 0000000000000000 0000000000000000 0000000000000000
注:位图以2个成对,且采用反向存储,01 = 000 0001实际为1000 0000
临时表空间
不允许存储permanent对象; 排序结束后临时段不被回收,其下extent被标示为free,存于SGA中的sort extent pool; 接下来的排序操作可从此缓存池中复用;
1个临时文件对应1条记录v$temp_extent_pool, extents_cached为已使用过的extent数量,extents_used表示当前使用的数量(动态变化),而extent一经使用变一直保持Cached状态;
SQL> select file_id,EXTENTS_CACHED,EXTENTS_USED from v$temp_extent_pool where EXTENTS_CACHED >0;
FILE_ID EXTENTS_CACHED EXTENTS_USED
---------- -------------- ------------
17 24999 1
20 30719 0
3 30719 1
23 30719 0
24 24999 0
25 24999 0
2 25599 1
1 25599 5
当前总计8个temp extent被使用
SQL> select sum(EXTENTS_CACHED) from v$temp_extent_pool;
SUM(EXTENTS_CACHED)
-------------------
218352
SQL> select count(*) from v$temp_extent_map;
COUNT(*)
----------
218352
说明所有的temp extent都被使用过,即全部缓存在SGA中;
自动扩展
当表空间有多个启用autoextend的数据文件时,扩展采用以下规则
1 将数据文件按maxsize - current size降序排列,即剩余容量最多的排第1位
2 从头扫描直至next < 剩余容量,扩展此数据文件
若表空间有多个数据文件,则extent应该是采用round-robin方式分配;
当表空间有3个数据文件,分别为50/10/20M
SQL> select FILE_ID,BLOCK_ID,BLOCKS,BLOCKS/128 extents from dba_free_space where TABLESPACE_NAME='TEST';
FILE_ID BLOCK_ID BLOCKS EXTENTS
---------- ---------- ---------- ----------
40 9 2432 19
38 9 6272 49
39 9 1152 9
新建1个表
create table t (id number(10)) tablespace test;
SQL> select FILE_ID,BLOCK_ID,BLOCKS,BLOCKS/128 extents from dba_free_space where TABLESPACE_NAME='TEST';
FILE_ID BLOCK_ID BLOCKS EXTENTS
---------- ---------- ---------- ----------
40 9 2432 19
38 9 6272 49
39 137 1024 8
分配6个extent
SQL> select FILE_ID,BLOCK_ID,BLOCKS,BLOCKS/128 extents from dba_free_space where TABLESPACE_NAME='TEST';
FILE_ID BLOCK_ID BLOCKS EXTENTS
---------- ---------- ---------- ----------
40 265 2176 17
38 265 6016 47
39 393 768 6
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15480802/viewspace-1097207/ ,如需转载,请注明出处,否则将追究法律责任。