ITPub博客

首页 > 数据库 > Oracle > 本地表空间管理小结

本地表空间管理小结

原创 Oracle 作者:myownstars 时间:2014-02-28 16:41:03 0 删除 编辑

通常数据文件头占用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/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: oracle的ASSM小结
请登录后发表评论 登录
全部评论

注册时间:2010-03-18

  • 博文量
    375
  • 访问量
    3320732