Oracle数据库扩展区(extent)概述
扩展区(extent)介绍
扩展区(extent)是数据库存储空间分配的逻辑单位 ,由多个连续数据块组成。
一个 扩展区(extent)总是包含在一个数据文件中。
每个段的第一个数据块包含该段中的扩展区(extent)目录。
在一个 扩展区(extent)中的数据块在逻辑上是连续的,但在物理上可能由于 RAID 条带化和文件系统的实施方式而在磁盘上分散分布。
分配扩展区(extent)
在默认情况下,在数据段被创建时,数据库会为数据段分配一个初始扩展区(extent)。一个 扩展区(extent)总是包含在一个数据文件中。
虽然还没有数据被添加到段中,在初始扩展区(extent)中的数据块被专门为段保留起来。
每个段的第一个数据块包含该段中的扩展区(extent)目录 。
下图显示了一个数据文件中某个段中的初始 扩展区(extent),它之前还没有包含任何数据

如果初始扩展区(extent)满了,并需要更多空间时,则数据库自动为该段分配一个增量扩展区(extent)。
一个增量扩展区(extent)是为该段创建的后续扩展区(extent)。
分配算法取决于表空间是本地管理的还是字典管理的。对于本地管理表空间,数据库搜索一个数据文件的位图,以查找相邻的可用数据块。如果该数据文件中没有足够的空间,则数据库到另一个数据文件中查找。
一个段的扩展区(extent)始终位于同一表空间中,但可能在不同的数据文件中。理解为段保存在表空间中,可以跨越数据文件,扩展区不能跨越数据文件,但是段中每一个扩展区,可以在不同的数据文件中。
下图显示,数据库可能为一个段,在表空间中的任意数据文件中分配扩展区(extent)。例如,段可能在 users01.dbf 中分配初始 扩展区(extent), 在 users02.dbf 中分配第一个增量扩展区(extent),并在 users01.dbf 中分配下一个 扩展区(extent)。

在新分配扩展区(extent)中的块,虽然他们是可用的,但可能并未清空旧数据。
在ASSM 中,对新分配扩展区(extent)中的块,只有当 Oracle 数据库开始使用它们时,才会根据需要将其格式化。
备注:本节仅适用于串行操作,即一个进程解析并运行一条语句。但在并行 SQL 语句中的扩展区(extent)具有不同的分配方式,它需要多个服务器进程。
释放扩展区(extent)
通常,用户段的扩展区(extent)不会返回给表空间,除非使用 DROP 命令删除该对象。
在 Oracle 数据库 11g 第 2 版中 (11.2.0.2),以及后续版本中,可以使用DBMS_SPACE_ADMIN 软件包删除段。例如,如果你删除了表中的所有行,但数据库不会回收数据块以供表空间中的其他对象使用。
注意:在一个撤消段中, 如果指定了 OPTIMAL 大小参数,或数据库处于自动撤消管理模式,则 Oracle 数据库会周期性地释放一个或多个扩展区(extent)。
在某些情况下,可以手动释放空间。基于对象中的碎片级别,Oracle 数据段顾问工具可帮助确定一个对象是否有空间可回收。以下技术可以释放扩展区(extent):
1、可以使用在线段收缩来回收在段中的零碎空间。段收缩是一种在线、 就地的操作。通常,紧凑的数据会获得更好的缓存利用率,且在全表扫描中只需读取更少的块。
2、可以将非分区表或表分区的数据移动到一个新的段,或可选地移入另一个你在其中具有配额的表空间。
3、可以重建或合并索引 。
4、可以截断表或表簇,这将删除所有行。默认情况下,除了留下由MINEXTENTS 存储参数所指定的扩展区(extent)数之外,Oracle 数据库将释放已删除行所使用的所有空间。在数据库 11g 第 2 版 (11.2.0.2) ,以及后续版本中中,还可以用带有 DROP ALL STORAGE 选项的 TRUNCATE 语句来删除整个段。
5、可以释放未使用的空间,即释放数据库段的高水位端的未使用空间,以便供表空间中的其他段使用。
当 扩展区(extent)被释放时,Oracle 数据库将修改本地管理表空间的数据文件中的位图,以反映重新获得作为可用空间的扩展区(extent)。被释放扩展区(extent)的数据块中的任何数据变得不可访问。
扩展区(extent)的存储参数
每一个段是由扩展区(extent)表示的存储参数来定义的。
这些参数控制 Oracle 数据库如何为段分配可用空间。
存储设置按如下的优先级顺序确定,列表中较高的设置会覆盖较低的设置:
1、段存储子句(最高优先级)
2、表空间存储子句
3、Oracle 数据库缺省值(最低优先级)
本地管理表空间可以具有统一的扩展区(extent)大小,或由系统自动确定可变的扩展区(extent)大小:
1、对统一的扩展区(extent),可以指定扩展区(extent)的大小,或使用默认的大小 1 MB。表空间中的所有扩展区(extent)都是一样大小。本地管理的临时表空间只能使用这种分配类型。
2、对于自动分配的扩展区(extent)由 Oracle 数据库确定新分配扩展区(extent)的最佳大小。
对本地管理表空间,其某些存储参数不能在表空间级指定。但是,可以在段级指定这些参数。在这种情况下,数据库使用所有参数一起计算段的初始大小。由内部算法确定每个后续扩展区(extent)的大小。
建议将《Oracle数据库逻辑存储结构》、《Oracle数据库表空间概述》、《Oracle数据库段segment概述》、《Oracle数据库扩展区(extent)概述》、《Oracle数据库数据块概述》这5篇文章一起看,对Oracle数据库的逻辑结构会有全面的理解。