oracle9I后可以对段内的数据块自动段空间管理,oracle9I前需要对段内的数据块手工管理。手工管理段空间manaual segment space management(MSSM)
手工管理段空间是在段头放置一个自由列表来管理block的使用,可以把自由列表freelist想象成tables,手工管理段空间也就是insert和delete这个自由列表的block来手工管理段空间。
可以create 手工管理的tablespace
Create tablespace MSSM datafile ‘’ size 50M
extent management local
segment space management manual
然后在MSSM中创建对象
Create table MSSM(id number) tablespace MSSM
在创建段时会为段分配自由列表freelist,默认的段内只有一个自由列表。
Select segment_name,segment_type.freelist from dba_segments
Dba_segments数据字典视图中记录了段内自由列表数,上述的MSSM表段内就默认得创建了自由列表。
当向一个对象中插入数据时,oracle会首先查找对象所在的段内自由列表freelist上寻找可用于插入数据的block,当block内的使用完毕后就从freelist上移除,然后段内block由于delete和update等释放空间时又要重新放置到freelist自由列表上。关于block到freelist主要是通过存储参数pctfree和pctused来实现。
当向一个block插入数据时,假设pctused=40 pctfree=20,往此block插入数据当block内的可用空间低于pctfree到时,无法再对此block插入数据,剩余的空间将用于更新段内已有的数据,将此block从自由列表freelist上移除,然后由于delete和update释放block内的空间,当block内的可用空间低于pctused时,此block又会被加载到自由列表freelist上用于后续block数据的插入更新。
段是由扩展构成,扩展由block构成,看oracle concept中block存储数据的最小I/O, 由于段是属于某个对象的,所以段内的block都是存储此对象的,一个block是无法存储两个段的对象数据行。
如果一个段内操作比较频繁,默认的段内都只有一个freelist自由列表用于管理段内的block的分配,那样就会导致竞争。
Select segment_name.file_id,block_id,blocks from dba_extents where tablespace_name=’USER’
Segment_name file_id block_id blocks
Ashuang 4 57 8
上面的segment_name段的名称,一般和表名 索引名相同,file_id数据扩展所在的数据文件的编号,block_id此扩展在段内数据块的起始编号,blocks代表此扩展的数据块数量。
(可以使用alter table tablename deallocate unused命令回收高水位后面未使用的块—回收未使用的数据扩展,但是回收后留下的总块数为8的倍数,从而一般不会把未使用的块是好全部回收。)
通过转储数据文件中的特定数据块
Alter system dump datafile 4 block_id 57
跟踪日志中:
Start dump data blocks tsn: 4 file#: 4 minblk 57 maxblk 57
buffer tsn: 4 rdba: 0x01000039 (4/57)
scn: 0x0000.00054017 seq: 0x02 flg: 0x04 tail: 0x40172002
frmt: 0x02 chkval: 0x062b type: 0x20=FIRST LEVEL BITMAP BLOCK
Dump of First Level Bitmap Block
--------------------------------
nbits : 4 nranges: 1 parent dba: 0x0100003a poffset: 0
unformatted: 0 total: 8 first useful block: 3
owning instance : 1
instance ownership changed at 08/30/2011 13:50:00
Last successful Search 08/30/2011 13:50:00
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 5
Extent Map Block Offset: 4294967295
First free datablock : 3
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Inc #: 0 Objd: 49204
HWM Flag: HWM Set
Highwater:: 0x01000041 ext#: 0 blk#: 8 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 5
mapblk 0x00000000 offset:0
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x01000039 Length: 8 Offset: 0
0:Metadata 1:Metadata 2:Metadata 3:75-100% free
4:75-100% free 5:75-100% free 6:75-100% free 7:75-100% free
可以看出每个数据块也记载着相应的scn信息,上面的hdr's freelists表示空闲的数据块数量。
[@more@]来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1054613/ ,如需转载,请注明出处,否则将追究法律责任。