临时表空间(Temporary Tablespace)是Oracle数据库中用于存储临时数据的专用空间,主要用于:
CREATE TEMPORARY TABLESPACE temp1
TEMPFILE '/u01/oradata/temp01.dbf' SIZE 100M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
-- 创建临时表空间组
ALTER TABLESPACE temp1 TABLESPACE GROUP temp_grp;
ALTER TABLESPACE temp2 TABLESPACE GROUP temp_grp;
-- 分配给用户
ALTER USER scott TEMPORARY TABLESPACE temp_grp;
CREATE TEMPORARY TABLESPACE temp2
TEMPFILE '/u01/oradata/temp02.dbf' SIZE 500M
AUTOEXTEND ON NEXT 50M MAXSIZE 2G
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 4M;
ALTER TABLESPACE temp1
ADD TEMPFILE '/u01/oradata/temp03.dbf' SIZE 200M;
ALTER TABLESPACE temp1
DROP TEMPFILE '/u01/oradata/temp03.dbf';
ALTER DATABASE TEMPFILE '/u01/oradata/temp01.dbf' RESIZE 500M;
DROP TABLESPACE temp1 INCLUDING CONTENTS AND DATAFILES;
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
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
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;
-- 根据系统负载设置适当大小
CREATE TEMPORARY TABLESPACE temp_large
TEMPFILE '/u01/oradata/temp_large.dbf' SIZE 2G;
ALTER DATABASE TEMPFILE '/u01/oradata/temp01.dbf'
AUTOEXTEND ON NEXT 100M MAXSIZE 10G;
ALTER TABLESPACE temp1
ADD TEMPFILE '/u02/oradata/temp02.dbf' SIZE 500M;
-- 创建新的临时表空间
CREATE TEMPORARY TABLESPACE temp_new ...;
-- 修改默认临时表空间
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_new;
-- 删除旧的临时表空间
DROP TABLESPACE temp_old INCLUDING CONTENTS AND DATAFILES;
-- 增加临时文件大小
ALTER DATABASE TEMPFILE '/path/to/tempfile.dbf' RESIZE 2G;
-- 或添加新的临时文件
ALTER TABLESPACE temp1 ADD TEMPFILE '/new/path/temp02.dbf' SIZE 1G;
-- 重建临时表空间是唯一有效的"碎片整理"方法
-- 1. 创建新的临时表空间
-- 2. 设置为默认临时表空间
-- 3. 删除旧的临时表空间
-- 解决方案:
-- 1. 将临时文件分散到不同磁盘
-- 2. 使用更快的存储设备(如SSD)
-- 3. 增加SORT_AREA_SIZE参数(仅对PGA内存排序有效)