
好的,我们来深入探讨 Oracle 段(Segment)内部的核心管理结构。这部分是 Oracle 存储管理的精髓,理解了它,就理解了 Oracle 如何高效地管理海量数据的空间分配和使用。
1. 核心概念:段的空间管理 - MSSM 与 ASSM
在深入了解“块”之前,必须首先明确段空间管理的两种模式,因为这将决定块的使用方式。
-
MSSM (Manual Segment Space Management) - 手动段空间管理
- 官方/专业解释: 使用自由列表 (Freelist) 来管理段内的空闲块。表的数据块中会保留一部分空间(PCTFREE)用于未来更新。当插入新数据时,Oracle 会从 Freelist 中寻找有空闲空间的块。需要手动设置
FREELISTS,PCTUSED,PCTFREE等参数。 - 通俗解释: 像一个老式的图书馆,管理员(Freelist)手里有一个小本本,记录着哪些书架(数据块)还有空位可以放新书(新数据)。一旦书架放满到一定程度(达到
PCTUSED),就从本本上划掉;当书被借走一些(删除数据),空位多了,再重新登记到本本上。这个过程相对繁琐,容易产生争用(Freelist Contention),尤其在并发插入很高的场景。
- 官方/专业解释: 使用自由列表 (Freelist) 来管理段内的空闲块。表的数据块中会保留一部分空间(PCTFREE)用于未来更新。当插入新数据时,Oracle 会从 Freelist 中寻找有空闲空间的块。需要手动设置
-
ASSM (Automatic Segment Space Management) - 自动段空间管理
- 官方/专业解释: 使用位图块 (Bitmap Blocks) 来管理段内的空闲空间。每个数据块在位图中都有一个对应的值,表示其空间使用情况(如满、75%满、50%满、25%满、空)。插入操作时,Oracle 直接查询位图即可快速找到有足够空间的块。这是创建表空间时的默认选项 (
SEGMENT SPACE MANAGEMENT AUTO)。 - 通俗解释: 像一个现代化的智能停车场。入口有一个巨大的电子显示屏(位图),每个车位都有一个传感器。屏幕上用不同颜色(位图值)实时显示哪些车位是空的(绿色)、哪些是半满的(黄色)、哪些已满(红色)。司机(插入操作)不用问管理员,看一眼屏幕就能直接开往空闲车位,效率极高,极大减少了拥堵和争用。
- 官方/专业解释: 使用位图块 (Bitmap Blocks) 来管理段内的空闲空间。每个数据块在位图中都有一个对应的值,表示其空间使用情况(如满、75%满、50%满、25%满、空)。插入操作时,Oracle 直接查询位图即可快速找到有足够空间的块。这是创建表空间时的默认选项 (
现代实践: ASSM 是绝对的主流和默认选择,它极大地简化了管理,并显著提高了高并发环境下的性能。我们接下来的讲解将完全基于 ASSM。
2. ASSM 的层次结构:L3, L2, L1 位图块
ASSM 引入了一种精巧的、分层的位图结构来管理空间。这些位图块本身就是段所分配的一系列区中的一些特殊的数据块。
层次关系与原理
官方/专业解释:
一个 ASSM 段包含一个段头块 (Segment Header Block) 和三种位图块:
- 第一级位图块 (L1 BMB): 直接管理一组数据块的空闲空间状态。每个 L1 BMB 可以管理最多 ~16, 个数据块(具体数量因块大小和操作系统而异)。
- 第二级位图块 (L2 BMB): 不直接管理数据块,而是管理一组 L1 BMB 的地址。每个 L2 BMB 可以管理多个 L1 BMB。
- 第三级位图块 (L3 BMB): 管理一组 L2 BMB 的地址。它是位图层次结构的根。一个段通常只有一个 L3 BMB,它存储在段头块中。如果段非常大,也可能需要额外的 L3 BMB。
空间管理的流程是自顶向下的:
- 当需要插入新数据时,Oracle 从 段头块 中找到 L3 BMB。
- L3 BMB 指向一个或多个 L2 BMB。
- L2 BMB 指向一个或多个 L1 BMB。
- L1 BMB 最终直接提供了其管辖范围内所有数据块的空闲空间状态(使用 5 种状态编码)。
通俗解释与举例:
想象一个庞大的跨国公司:
- 数据块: 最基层的一线员工。
- L1 位图块 (经理): 每个经理管理着约16个员工。他手里有一个表格(位图),清楚记录着每个员工当前的工作负荷是“空闲”、“半忙”还是“全忙”。当有新任务时,首先找经理。
- L2 位图块 (总监): 总监不直接管理员工,他管理着多个经理。他只知道哪个经理的团队里可能有空闲的员工。
- L3 位图块 (CEO): 公司的总负责人。他只知道公司有几个总监。所有任务分配请求,最终都要从CEO这里开始层层下达。
- 段头块 (CEO的办公室+公司总名录): CEO的办公室(L3 BMB)就在这个总部大楼里,这个大楼同时还存放着公司最重要的信息,比如“公司已经占用了哪些办公楼(区)”(Extent Map)。
这个过程的意义:
- 高效: 避免了MSSM中Freelist的争用。多个会话可以并发地查询不同部分的位图来寻找空间,而无需争抢一个公共的“列表”。
- 精准: 位图提供了更细粒度的空间信息(25%, 50%, 75%, 100%),使Oracle能更智能地为不同大小的插入操作选择最合适的块,从而减少行链接和空间碎片。
- 可扩展: 分层结构使得管理海量数据成为可能。CEO不需要认识每一个员工,他只需要管理好几个总监即可。
3. 段头块 (Segment Header Block) 和区映射图 (Extent Map)
官方/专业解释:
- 段头块: 是段中第一个区的第一个块。它包含了管理这个段所需的元数据 (metadata)。最重要的是,它包含了区映射图 (Extent Map) 和 L3 位图块 (L3 BMB) 的地址。
- 区映射图 (Extent Map): 是存储在段头块中的一个数据结构。它记录了该段所拥有的每一个区 (Extent) 的详细信息:
- 区编号 (Extent ID)
- 起始数据文件ID (File ID)
- 起始数据块地址 (Block ID)
- 区的大小(包含多少个块)
通俗解释:
段头块是段的“大脑”和“地图册”。
- 它自己是“大脑”(L3 BMB),负责发起所有寻找空间的任务。
- 它内部的“区映射图”就是一本“地图册”,精确记录了段的所有“领土”(已分配的区)在哪里。当段需要增长(分配新区)时,这个地图册就会增加新的一页(记录一个新区的信息)。
工作原理:
当数据库需要读取段中的数据时(即使是全表扫描),它也必须首先访问段头块,获取到区映射图,然后才能知道这个段的数据具体分布在哪些文件的哪些区上,然后才能去访问那些数据。
4. 相关查询与管理 SQL 命令
A. 查询段的空间管理方式
SELECT tablespace_name, segment_space_management
FROM dba_tablespaces;
-- 输出为 'AUTO' 即为 ASSM,'MANUAL' 则为 MSSM。
B. 查看段的头块位置和区信息
SELECT header_file, header_block, extent_management, allocation_type
FROM dba_segments
WHERE segment_name = 'YOUR_TABLE_NAME' AND owner = 'YOUR_SCHEMA';
-- `header_file` 和 `header_block` 指明了段头块的位置。
C. 查看段的所有区(Extent Map的直观展示)
SELECT extent_id, file_id, block_id, blocks, bytes
FROM dba_extents
WHERE segment_name = 'YOUR_TABLE_NAME' AND owner = 'YOUR_SCHEMA'
ORDER BY extent_id;
-- 这个查询结果模拟了“区映射图”的内容。
D. (高级) 转储段头块内容进行分析
这是一个深入诊断的操作,会在服务器端的跟踪文件中生成原始数据块的内容,需要DBA权限。
-- 1. 首先找到段的 DATA_OBJECT_ID
SELECT data_object_id FROM dba_objects WHERE object_name = 'YOUR_TABLE_NAME' AND owner = 'YOUR_SCHEMA';
-- 2. 使用得到的 DATA_OBJECT_ID (例如 12345) 进行转储
ALTER SYSTEM DUMP DATAFILE <header_file_id> BLOCK MIN <header_block_id> BLOCK MAX <header_block_id>;
-- 例如: ALTER SYSTEM DUMP DATAFILE 5 BLOCK MIN 134 BLOCK MAX 134;
-- 3. 去数据库服务器的 `udump` 或 `diag/rdbms/.../trace` 目录下找到生成的跟踪文件。
-- 在文件中,你可以搜索 ‘Extent Map’ 和 ‘L1’, ‘L2’, ‘L3’ 来查看详细信息。
E. 管理命令
ASSM 是自动的,所以几乎没有需要手动管理 L1/L2/L3 位图块的情况。你的管理操作仍然集中在段和表空间层面:
- 移动/重组段: 这会重建段,从而重建所有的位图结构。
ALTER TABLE your_table MOVE TABLESPACE another_tablespace; - 收缩段: 重置高水位线并压缩数据,位图会被重新计算。
ALTER TABLE your_table SHRINK SPACE; - 重建索引: 索引也是一个段,重建它会重建其内部的位图结构。
ALTER INDEX your_index REBUILD;
总结
| 组件 | 官方角色 | 通俗比喻 | 关键点 |
| :— | :— | :— | :— |
| ASSM | 使用位图自动管理段内空间 | 智能停车场引导系统 | 现代默认,高效,减少争用 |
| L1 BMB | 直接管理一组数据块空间状态 | 部门经理 | 直接管理员工(数据块) |
| L2 BMB | 管理一组 L1 BMB 的地址 | 总监 | 管理经理(L1 BMB) |
| L3 BMB | 位图层次结构的根,管理 L2 BMB | CEO | 通常只有一个,在段头块内 |
| 段头块 | 段的元数据核心,包含 Extent Map 和 L3 BMB | 公司总部+地图册 | 段的起点,包含所有区的分配记录 |
| 区映射图 | 记录段所有区的分配详情 | 地图册 | 存储在段头块中,是访问段数据的“地图” |
理解这些内部结构,有助于你在遇到性能问题时(如高水位线问题、索引碎片)能更深入地思考根源,并选择正确的重组或维护操作来解决它们。ASSM 的自动化使得日常管理变得异常简单,但背后的原理依然是 DBA 知识库中宝贵的一部分。
欢迎关注我的公众号《IT小Chen》
749

被折叠的 条评论
为什么被折叠?



