1. 表空间(Tablespace)
定义:
表空间是Oracle中最高级别的逻辑存储容器,由一个或多个物理数据文件(Datafile)组成。所有数据库对象(如表、索引)的逻辑存储均属于某个表空间。
类型与作用
类型 | 功能 |
---|---|
系统表空间 | - 包含数据字典(如SYSTEM 表空间)和系统元数据。- SYSAUX 是辅助系统表空间,存放非核心组件数据(如AWR报告)。 |
用户表空间 | - 存储用户创建的数据库对象(如表、索引)。 - 例如 USERS 表空间默认存储用户数据。 |
临时表空间 | - 用于排序、哈希连接等临时操作(如TEMP )。- 数据在会话结束后自动清理。 |
撤销表空间(UNDO) | - 存储事务回滚信息,支持事务一致性、读一致性和回滚操作。 |
大文件表空间 | - 仅包含一个超大文件(最大可达128TB),简化存储管理。 |
管理操作
创建表空间:
CREATE TABLESPACE users_data
DATAFILE '/u01/oradata/users01.dbf' SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;
扩展表空间
通过增加数据文件或扩展现有文件:
ALTER TABLESPACE users_data ADD DATAFILE '/u01/oradata/users02.dbf' SIZE 200M;
2. 段(Segment)
定义:
段是特定数据库对象(如表、索引)占用的存储空间的逻辑集合。每个段由一个或多个区(Extent)组成。
类型与示例
类型 | 描述 |
---|---|
数据段 | 存储表或簇的数据(如TABLE )。 |
索引段 | 存储索引数据(如INDEX )。 |
临时段 | 临时操作(排序、临时表)使用的空间,由临时表空间管理。 |
回滚段 | 存储撤销信息(旧版本数据),由撤销表空间统一管理(替代传统手动回滚段)。 |
查看段信息
SELECT segment_name, segment_type, tablespace_name
FROM dba_segments
WHERE owner = 'SCOTT';
3. 区(Extent)
定义:
区是Oracle分配存储空间的最小逻辑单元,由一组连续的数据块组成。段在扩展时会分配新的区。
特点
-
连续分配:区内的数据块物理连续,提高I/O效率。
-
自动扩展:当段需要更多空间时,Oracle自动分配新区。
-
管理方式:
-
字典管理表空间(已淘汰):通过数据字典表管理区分配。
-
本地管理表空间(默认):通过位图(Bitmap)在数据文件头部管理区分配,更高效。
-
4. 数据块(Data Block)
定义:
数据块是Oracle中最小的I/O单元,也是存储数据的物理基础。块大小由参数DB_BLOCK_SIZE
定义(通常为8KB),可在创建数据库时指定。
块结构
组成部分 | 描述 |
---|---|
块头(Header) | 包含块元数据(如块地址、事务槽)。 |
表目录 | 记录该块所属的表或索引。 |
行目录 | 存储块内每行的位置信息。 |
空闲空间 | 未使用的空间,用于插入新数据或更新现有数据。 |
行数据 | 实际存储的数据行。 |
块管理优化
-
PCTFREE:指定块中保留的空闲空间比例(默认为10%),用于未来更新。
-
PCTUSED(仅适用于手动段管理):当块使用率低于此值时,块可重新插入数据(已废弃,ASSM自动管理)。
5. 存储层次关系
-
表空间 → 段 → 区 → 数据块
例如:-
用户表
EMP
存储在USERS
表空间中。 -
EMP
表对应一个数据段,该段由多个区组成。 -
每个区包含若干连续的数据块。
-
数据块实际存储表中的行数据。
-
6. 实际应用示例
创建表并指定表空间
CREATE TABLE scott.employee (
emp_id NUMBER,
name VARCHAR2(50)
)
TABLESPACE users_data;
监控存储分配
-- 查看表空间使用情况
SELECT tablespace_name, sum(bytes)/1024/1024 AS "Size(MB)"
FROM dba_data_files
GROUP BY tablespace_name;-- 查看段的空间占用
SELECT segment_name, bytes/1024/1024 AS "Size(MB)"
FROM dba_segments
WHERE owner = 'SCOTT';
7. 常见问题与优化
表空间不足
扩展数据文件或添加新文件:
ALTER DATABASE DATAFILE '/u01/oradata/users01.dbf' RESIZE 500M;
段碎片化
-
使用
ALTER TABLE ... MOVE
重建表或在线重定义(DBMS_REDEFINITION)。
数据块效率
-
根据业务负载选择合适的块大小(OLTP用小块,OLAP用大块)。