Oracle 表空间、段、区、块是什么关系?
简化版
Oracle 的存储层级可以记为:表空间包含数据文件,数据文件里存数据块;对象占用段,段由区组成,区由连续的数据块组成。数据块是 Oracle 读写 I/O 的基本单位,区是空间分配单位,段是表、索引等对象占用空间的集合,表空间是逻辑存储容器。
详细版
层级关系可以这样理解:
| 层级 | 含义 |
|---|---|
| Tablespace | 逻辑存储容器 |
| Datafile | 表空间对应的物理文件 |
| Segment | 表、索引等对象占用的空间 |
| Extent | 一组连续数据块,是空间分配单位 |
| Block | 最小逻辑 I/O 单位 |
一个表通常对应一个段,一个索引也对应一个段。段增长时,Oracle 会分配新的区;区由多个连续块组成;块中存放具体行数据、索引条目等内容。
完整版教学
一、为什么要理解存储结构
Oracle 面试问表空间、段、区、块,不只是背概念,而是看你是否理解数据库对象如何落到存储上。
这些概念会影响:
- 空间管理;
- 表和索引增长;
- I/O 读写;
- 高水位线;
- 表空间容量规划;
- 大对象和分区对象管理。
二、表空间是逻辑容器
表空间是 Oracle 管理存储的逻辑单位。创建用户、表、索引时,通常会指定默认表空间。
表空间本身不是一个单独的磁盘文件,它对应一个或多个数据文件:
Tablespace
├── datafile01.dbf
└── datafile02.dbf
这样做的好处是逻辑管理和物理文件可以分离。
三、数据文件承载真实数据
数据文件是操作系统层面的物理文件,真正占用磁盘空间。表空间扩容时,常见方式是增加数据文件或扩大已有数据文件。
但业务对象不直接说“我要放到某个块里”,而是通过表空间、段、区这些层级由数据库管理。
四、段对应对象占用的空间
Segment 可以理解为一个数据库对象占用空间的集合。常见段包括:
- 表段;
- 索引段;
- 临时段;
- UNDO 段;
- LOB 段。
例如创建一张普通表后,随着插入数据,它会占用表段空间。为这张表建索引,又会有对应索引段。
五、区是空间分配单位
Extent 是一组连续的数据块。段需要增长时,Oracle 不会每次只分配一个块,而是分配一个区。
这样能降低空间管理开销,也让对象增长更高效。
可以理解为:段是一个对象的“房产”,区是一批连续“房间”,块是每间房里真正放数据的最小单位。
六、块是最小逻辑 I/O 单位
Oracle 数据块是数据库读写的最小逻辑单位。即使只查一行,数据库也会把包含这行的数据块读入缓冲区。
这解释了为什么索引、行迁移、行链接、块大小、缓存命中率都会影响性能。
如果一条查询需要访问很多分散的数据块,即使返回行数不多,也可能产生大量随机 I/O。
七、常见误区与追问
| 层级 | 类比 | 关键作用 |
|---|---|---|
| Tablespace | 园区 | 逻辑管理空间 |
| Segment | 一栋楼 | 表、索引等对象占用空间 |
| Extent | 一层连续房间 | 批量分配空间 |
| Block | 单个房间 | 最小逻辑 I/O 单位 |
记忆钩子:从管理视角看表空间,从对象视角看段,从分配视角看区,从 I/O 视角看块。四个概念回答的是不同层级的问题。
用数字理解:如果数据块大小是 8KB,一行平均 200B,理想情况下一个块可容纳约 8192 / 200 ≈ 40 行。查询返回 100 行,如果这些行分散在 100 个块里,I/O 成本可能远高于集中在 3 个块里。这就是块、行迁移、聚簇度、索引回表会影响性能的原因。
- 误区:表空间就是一个物理文件。 表空间是逻辑容器,可以对应一个或多个 datafile。
- 误区:一个表只占一个区。 表段会随着数据增长分配多个 extent,extent 才是空间分配单位。
- 误区:只查一行就只读这一行。 数据库按块读写,包含这行的数据块会被读入缓冲区。
- 追问:表和索引分别是什么段? 普通表有表段,索引有索引段,LOB、UNDO、临时对象也可能有各自段。
- 追问:区为什么要由连续块组成? 批量连续分配能降低空间管理成本,也让段增长更可控。
- 追问:这些概念和性能有什么关系? 块访问数量、行迁移、索引回表、段增长、高水位线和表空间容量都会影响 I/O 与维护。
八、加强记忆
Oracle 存储层级从大到小记:表空间管逻辑空间,数据文件落到磁盘,段对应表和索引,区负责批量分配空间,块负责实际读写。空间管理问题往往不是抽象概念,而会直接影响容量、I/O 和性能。