Oracle数据库扩展区(extent)概述

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数据库的逻辑结构会有全面的理解。

相关推荐
IT策士2 小时前
Redis 从入门到精通:初识 Redis
数据库·redis·缓存
不剪发的Tony老师2 小时前
DBHub:一款免费开源的数据库MCP服务器
数据库·mcp
oqX0Cazj22 小时前
Go-Zero数据库事务实战:本地事务+失败自动回滚+生产避坑+简单分布式事务方案
数据库·分布式·golang
小肥君2 小时前
sqlite查询
数据库·sqlite
摇滚侠2 小时前
Spring 零基础入门到进阶 基于 XML 管理 Bean 29-37
xml·java·数据库·后端·spring·intellij-idea
TDengine (老段)2 小时前
TDengine 语义分析与 AST 重写 — Catalog 校验、列绑定与表达式规范化
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
我是一颗柠檬2 小时前
【Java项目技术亮点】接口限流熔断:从Sentinel到令牌桶/漏桶,手把手教你构建高可用服务防护体系
java·数据库·sentinel
AC赳赳老秦2 小时前
用 OpenClaw 整理学习笔记:自动提取视频课程内容、生成文字笔记、分类归档
大数据·运维·数据库·人工智能·学习·deepseek·openclaw
时光追逐者2 小时前
一个基于 .NET 与 Avalonia 构建、面向 TrinityCore 的开源 WoW 数据库编辑器
数据库·开源·.net