在 Oracle 11g 中,表空间(Tablespace) 是数据库存储架构的核心逻辑单元,其原理基于 逻辑存储与物理存储的分离,通过分层管理数据文件、段(Segment)、区(Extent)和数据块(Data Block)。
1. 逻辑存储与物理存储的映射
-
表空间是逻辑容器:用户创建的表、索引等对象存储在表空间中,但这些对象并不直接绑定到物理文件,而是通过表空间与数据文件(Data Files)关联。
-
数据文件是物理实体 :每个表空间包含一个或多个物理数据文件(
.dbf
),数据实际存储在数据文件中。
CREATE TABLESPACE users
DATAFILE '/u01/oradata/users01.dbf' SIZE 100M;
2. 存储层次结构
数据库(Database) → 表空间(Tablespace) → 段(Segment) → 区(Extent) → 数据块(Data Block)
-
段(Segment) :
表空间中存储的独立对象,如表段(
TABLE
)、索引段(INDEX
)、撤销段(UNDO
)、临时段(TEMP
)。 -
区(Extent) :
由连续的数据块组成的存储单元。当段需要更多空间时,Oracle 会分配新的区。
-
数据块(Data Block) :
最小的 I/O 操作单位(默认大小 8KB),数据块大小由表空间定义。
3. 表空间的空间管理
-
区(Extent)的分配与回收:
-
当段需要空间时,Oracle 从表空间中分配一个或多个区。
-
删除对象时,区会被回收并标记为可用,但可能不会立即释放给操作系统(取决于存储参数)。
-
-
自动段空间管理(ASSM) :
使用位图(Bitmap)管理区内的空闲空间,替代传统的手动自由列表(Free List),提高并发性能。
4. 表空间类型与用途
表空间类型 | 原理与用途 |
---|---|
永久表空间 | 存储用户数据(如表、索引),如 USERS 。 |
临时表空间 | 存储排序、哈希连接等临时数据,如 TEMP 。 |
撤销表空间(UNDO) | 记录事务的撤销信息,支持回滚和一致性读,如 UNDOTBS1 。 |
大文件表空间 | 单个数据文件可支持超大容量(最大 32TB),简化存储管理。 |
5. 数据文件与表空间的关系
-
一个表空间可以包含多个数据文件,数据文件分散在多个磁盘上以提高性能(如 RAID 或 ASM)。
-
数据文件支持自动扩展(
AUTOEXTEND ON
),避免因空间不足导致操作失败
6. 表空间的管理方式
-
字典管理表空间(过时) :
使用数据字典表(如
SYS.UET$
和SYS.FET$
)记录区的分配信息,存在性能瓶颈。 -
本地管理表空间(默认) :
使用表空间头部存储的位图管理区的分配,效率更高,减少数据字典争用。
7. 数据块的结构
每个数据块包含以下部分:
-
块头(Header):块元数据(如事务信息、SCN)。
-
表目录(Table Directory):记录块中存储的表信息。
-
行目录(Row Directory):指向块内各行数据的指针。
-
空闲空间(Free Space):未使用的空间,用于新数据或更新操作。
8. 关键原理总结
-
逻辑与物理分离:用户操作逻辑对象(如表),Oracle 自动管理物理文件。
-
存储层次化:通过段、区、数据块实现精细的空间管理。
-
性能优化:
-
将高 I/O 的表空间(如索引、数据)分散到不同磁盘。
-
使用临时表空间减少对永久表空间的争用。
-
-
事务一致性:UNDO 表空间支持多版本读一致性和事务回滚。
9. 示例:表空间操作
sql
-- 创建表空间
CREATE TABLESPACE app_data
DATAFILE '/u01/oradata/app01.dbf' SIZE 500M
AUTOEXTEND ON NEXT 50M MAXSIZE 2G;
-- 将表分配到表空间
CREATE TABLE orders (
order_id NUMBER,
customer_id NUMBER
) TABLESPACE app_data;
-- 查询表空间使用情况
SELECT tablespace_name, file_name, bytes/1024/1024 AS size_mb
FROM dba_data_files;
10. 常见问题与原理
-
空间不足 :数据文件未自动扩展或达到
MAXSIZE
,导致 ORA-01653 错误。 -
碎片化:频繁分配和释放区可能导致碎片,影响性能(本地管理表空间较少出现)。
-
备份与恢复 :表空间级备份(
TABLESPACE
)比全库备份更灵活,支持热备份。
11. 查询表所属的表空间
SELECT owner, table_name, tablespace_name FROM dba_tables WHERE table_name = 'AI_TOOLS' AND owner = 'NEW_USER';

12.查询表空间对应的数据文件路径
SELECT file_name FROM dba_data_files WHERE tablespace_name = 'USERS';
