Oracle的逻辑结构是一种层次结构。主要由:表空间、段、区和数据块等概念组成。逻辑结构是面向用户的,用户使用Oracle开发应用程序使用的就是逻辑结构。数据库存储层次结构及其构成关系,结构对象也从数据块到表空间形成了不同层次的粒度关系,如图2-3和图2-4所示。
图2-3 Oracle 10g数据库层次结构图
图2-4 段、区和数据块之间的关系
1、数据块
Oracle数据块(Data Block)是一组连续的操作系统块。分配数据库块大小是在Oracle数据库创建时设置的,数据块是Oracle读写的基本单位。数据块的大小一般是操作系统块大小的整数倍,这样可以避免不必要的系统I/O操作。从Oracle9i开始,在同一数据库中不同表空间的数据块大小可以不同。数据块是Oracle最基本的存储单位,而表空间、段、区间则是逻辑组织的构成成员。在数据库缓冲区中的每一个块都是一个数据块,一个数据块不能跨越多个文件。
数据块的结构主要包括:
标题:包括一般的块信息,如块地址,段类型等。
表目录:包括有关表在该数据块中的行信息。
行目录:包括有关在该数据块中行地址等信息。
行数据:包括表或索引数据。一行可跨越多个数据块。
空闲空间:分配空闲空间是用于插入新的行和需要额外空间的行更新。通过空间管理参数pctfree可控制空闲空间的使用。空闲空间的管理既可以是自动的也可以是手动的。
在数据操作中,有两种语句可以增加数据库块的空闲空间:一个是Delete删除语句,另一个是Update更新现有行。释放的空闲空间可用于insert语句,如果insert语句是与产生空闲空间的语句在同一个事务之中,并在其后执行,则insert语句可直接使用生成的空闲空间。如果insert语句是在一个与产生空闲空间的语句相分离的事务中,则insert语句可在其他事务提交后,并在其需要空间时,使用之前产生的空闲空间。
数据块中释放的空间可能是连续的,也可能不连续。Oracle只有在出现下列情况时,才会合并数据块的空闲空间:当insert或update语句要使用一个数据块,该数据块的空闲空间足以存储新的一行,而且空闲空间均是碎片,数据块中连续空间无法插入一行的时候。除此而外,Oracle在系统性能下降时也需要压缩数据块的空间。