oracle 在数据文件内存储数据的最小单元是数据块。一个oracle数据库包含至少一个操作系统数据块。oracle数据库的大小用
参数DB_BLOCK_SIZE来定义。
1.Overhead:
头块(header):包含块的总体信息,例如块地址/段类型等。
表路径(Table Directory):存储本块内包含的行。
行路径(Row Directory):包含本块内包含的行的实际信息(行位置等)。
数据块的头信息一旦分配,一旦这一行删除,这块空间就不再重新声明。因此,一个现在为空,但是曾经包含50行记录的块,在
头信息里仍然保留被分配的100个字节。oracle只在新的行加入这个块的时候才会重用这块区域。
2.行数据(Row Data)
这也部分包含表或索引的数据。行可以跨块。
空闲区域(Free Space):
空闲区域是为INSERT和UPDATE分配的空间。为表或索引分配的数据块,空闲区域可以包含事务条目。在每个 INSERT, UPDATE,
DELETE, and SELECT...FOR UPDATE语句都需要事务条目。事务条目需要的空间随操作系统会有所不同,但大部分操作系统都是
23bytes。
空闲区域的管理:
空闲区域可以自动或手动管理。空闲区域管理可以在数据库段内自动管理。段自带的空闲/使用空间相对于空闲列表是采用二叉
树来跟踪的。自动段空间管理提供了以下的好处:
1)易于管理
2)更好的空间利用率,尤其是对于行尺寸经常变化的对象。
3)更好的对于并发访问的自动调整。这样
4)在多实例数据库,提供性能和空间利用率。
在创建本地管理的表空间的时候定义了自动段空间管理。在本地管理表空间内所有的段都具备这样的特性。
oracle块内空闲空间的使用和优化:
有两类操作会增加块内的空闲区域,DELETE和涉及字段变大的UPDATE。者以下的情况下,这些操作释放的区域可以被后续的
INSERT操作使用:
1)如果后续的INSERT和DELTEE/UPDATE操作中同一个事务内。
2)INSERT和DELTEE/UPDATE不在同一个事务内,但是DELETE/UPDATE事务已经提交,而且必须这些空闲区域是必须的。
释放是区域可能可其他区域不是连续的。oracle只有在以下情况才会合并空闲区域:
1)INSERT/UPDATE试图使用一个具有足够的空闲区域的块的时候;
2)并且,这些空闲区域是分散的。
oracle这样做是因为考虑到了数据库的性能可能会由于对数据的连续性的压缩导致性能低下。
行链和行迁移:
在两种情形下表内的一行数据可能太大,以至于不能存放在一个oracle块内。第一种情形是,在数据初始插入时就不能再一个
oracle块内装下,在这种情形下,oracle把数据存在block链内;第二种情形是,数据初始存入时可以在一个块内存下,并且此
时数据所在的oracle块已经满了。在这种情形下,oracle会把这行数据整行迁移到另外一个可以存下这行数据的新的块内,同时
在原来的位置设置指针指向新的位置,ROWID不变。
不论是块链还是行迁移,数据库的性能都会受到影响,因为数据访问需要涉及不止一个块。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7353848/viewspace-672945/ ,如需转载,请注明出处,否则将追究法律责任。