Oracle 临时表空间详解
一 临时表空间概述
临时表空间(Temporary Tablespace)是Oracle数据库中用于存储临时数据的专用空间,主要用于:
- 排序操作(ORDER BY, GROUP BY等)
- 哈希连接(HASH JOIN)
- 临时表数据
- 某些类型的索引创建
- 临时LOB对象存储
二 临时表空间类型
2.1 本地管理的临时表空间
CREATE TEMPORARY TABLESPACE temp1
TEMPFILE '/u01/oradata/temp01.dbf' SIZE 100M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
2.2 临时表空间组(11g+)
-- 创建临时表空间组
ALTER TABLESPACE temp1 TABLESPACE GROUP temp_grp;
ALTER TABLESPACE temp2 TABLESPACE GROUP temp_grp;
-- 分配给用户
ALTER USER scott TEMPORARY TABLESPACE temp_grp;
三 临时表空间管理
3.1 创建临时表空间
CREATE TEMPORARY TABLESPACE temp2
TEMPFILE '/u01/oradata/temp02.dbf' SIZE 500M
AUTOEXTEND ON NEXT 50M MAXSIZE 2G
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 4M;
3.2 添加临时文件
ALTER TABLESPACE temp1
ADD TEMPFILE '/u01/oradata/temp03.dbf' SIZE 200M;
3.3 删除临时文件
ALTER TABLESPACE temp1
DROP TEMPFILE '/u01/oradata/temp03.dbf';
3.4 调整临时文件大小
ALTER DATABASE TEMPFILE '/u01/oradata/temp01.dbf' RESIZE 500M;
3.5 删除临时表空间
DROP TABLESPACE temp1 INCLUDING CONTENTS AND DATAFILES;
四 临时表空间监控
4.1 查看所有临时表空间数据文件
SELECT tablespace_name, file_name, bytes/1024/1024 MB, autoextensible
FROM dba_temp_files;
输出示例:
SQL> SELECT tablespace_name, file_name, bytes/1024/1024 MB, autoextensible
2 FROM dba_temp_files;
TABLESPACE_NAME FILE_NAME MB AUT
------------------------------ --------------------------------------------------------------------------- ---------- ---
TEMP /u01/app/oracle/oradata/ORCL/temp03.dbf 1024 YES
4.2 查看临时表空间使用情况
SELECT
tablespace_name,
SUM(bytes_used)/1024/1024 "Used (MB)",
SUM(bytes_free)/1024/1024 "Free (MB)",
ROUND(SUM(bytes_used)/SUM(bytes_used+bytes_free)*100,2) "Pct Used"
FROM v$temp_space_header
GROUP BY tablespace_name;
输出示例:
TABLESPACE_NAME Used (MB) Free (MB) Pct Used
------------------------------ ---------- ---------- ----------
TEMP 430 594 41.99
4.3 查看会话临时空间使用
SELECT
s.sid, s.serial#, s.username, s.status,
t.tablespace, t.blocks,
t.blocks*(SELECT block_size FROM dba_tablespaces
WHERE tablespace_name=t.tablespace)/1024/1024 "MB Used",
t.sql_id
FROM v$session s, v$tempseg_usage t
WHERE s.saddr = t.session_addr
ORDER BY t.blocks DESC;
五、临时表空间优化
5.1 合理设置初始大小
-- 根据系统负载设置适当大小
CREATE TEMPORARY TABLESPACE temp_large
TEMPFILE '/u01/oradata/temp_large.dbf' SIZE 2G;
5.2 启用自动扩展
ALTER DATABASE TEMPFILE '/u01/oradata/temp01.dbf'
AUTOEXTEND ON NEXT 100M MAXSIZE 10G;
5.3 使用多个临时文件分散I/O
ALTER TABLESPACE temp1
ADD TEMPFILE '/u02/oradata/temp02.dbf' SIZE 500M;
5.4 定期重建临时表空间
-- 创建新的临时表空间
CREATE TEMPORARY TABLESPACE temp_new ...;
-- 修改默认临时表空间
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_new;
-- 删除旧的临时表空间
DROP TABLESPACE temp_old INCLUDING CONTENTS AND DATAFILES;
六 常见问题处理
6.1 临时表空间不足
-- 增加临时文件大小
ALTER DATABASE TEMPFILE '/path/to/tempfile.dbf' RESIZE 2G;
-- 或添加新的临时文件
ALTER TABLESPACE temp1 ADD TEMPFILE '/new/path/temp02.dbf' SIZE 1G;
6.2 临时表空间碎片整理
-- 重建临时表空间是唯一有效的"碎片整理"方法
-- 1. 创建新的临时表空间
-- 2. 设置为默认临时表空间
-- 3. 删除旧的临时表空间
6.3 临时表空间I/O性能问题
-- 解决方案:
-- 1. 将临时文件分散到不同磁盘
-- 2. 使用更快的存储设备(如SSD)
-- 3. 增加SORT_AREA_SIZE参数(仅对PGA内存排序有效)
七 最佳实践
- 专用临时表空间:为不同应用创建独立的临时表空间
- 监控预警:设置临时表空间使用率监控
- 定期维护:每年至少重建一次临时表空间
- 合理规划:根据业务高峰期需求配置足够空间
- 避免过度使用:优化SQL减少临时空间需求