ORDER BY、GROUP BY、DISTINCT、UNION、INDEX CREATE/REBUILD、HASH JOIN 等操作。SORT_AREA_SIZE / PGA_AGGREGATE_TARGET 限制),溢寫到 **臨時表空間** 磁盤(建立臨時段)。| 版本 | 手工管理模式 | 自動管理模式(推薦) |
|---|---|---|
| 9i/10g | SORT_AREA_SIZE (會話級) | WORKAREA_SIZE_POLICY=AUTO + PGA_AGGREGATE_TARGET |
| 11g+ | 棄用 | PGA_AGGREGATE_TARGET / PGA_AGGREGATE_LIMIT (12c+) |
最佳實踐:全面啟用自動模式,設定 PGA_AGGREGATE_TARGET 為物理內存 20%~30%(扣除 SGA 後),12c+ 另設 PGA_AGGREGATE_LIMIT 防止單會話佔用過大導致 ORA-04036。
TEMP 表空間,切勿共用 SYSTEM/SYSAUX/用戶表空間。CREATE TEMPORARY TABLESPACE temp
TEMPFILE '/u01/oradata/temp01.dbf' SIZE 10G
AUTOEXTEND ON NEXT 1G MAXSIZE 50G
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
UNIFORM SIZE 1M 減少臨時段碎片,提升分配效率。ALTER TABLESPACE temp1 TABLESPACE GROUP temp_grp; 多臨時表空間負載均衡,防單文件瓶頸。
-- 1. 臨時段使用情況
SELECT tablespace_name, SUM(bytes_used)/1024/1024 AS used_mb,
SUM(bytes_free)/1024/1024 AS free_mb
FROM v$temp_space_header GROUP BY tablespace_name;
-- 2. 當前會話臨時段佔用 Top 10
SELECT s.sid, s.serial#, s.username, u.tablespace, u.segtype,
u.blocks * ts.block_size / 1024/1024 AS mb
FROM v$sort_usage u
JOIN v$session s ON u.session_addr = s.saddr
JOIN dba_tablespaces ts ON u.tablespace = ts.tablespace_name
ORDER BY mb DESC FETCH FIRST 10 ROWS ONLY;
-- 3. 歷史高水位
SELECT * FROM dba_hist_temp_stat ORDER BY snap_id DESC FETCH FIRST 20 ROWS ONLY;
| 現象 | 根因 | 對策 |
|---|---|---|
| 臨時表空間頻繁報滿 | PGA 過小導致大量溢寫 | 增大 PGA_AGGREGATE_TARGET;檢查 SQL 執行計劃是否為 HASH JOIN/SORT 濫用 |
| 查詢排序極慢 | 磁盤 I/O 等待 | 優化 SQL(減少結果集、加索引避免排序);SSD 存放臨時文件 |
| ORA-04030/PGA 耗盡 | 單會話佔用過大(如大集合、PL/SQL 陣列) | 設置 PGA_AGGREGATE_LIMIT;代碼層面分批處理、釋放集合 |
| 並發高時臨時段爭用 | 單臨時文件鎖爭用 | 多文件 + 臨時表空間組 |
SORT_AREA_SIZE 還在用。事實:11g+ 已棄用,自動模式下被忽略。TEMP 表空間可手動縮小。事實:僅能 ALTER DATABASE TEMPFILE ... RESIZE,且不能小於高水位。PGA_AGGREGATE_TARGET 是硬上限。事實:它是「目標值」,實際可超過(12c+ 用 LIMIT 硬限制)。臨時表空間不是「臨時工」,而是排序、雜湊、索引建立等核心操作的**磁盤後備緩衝區**。PGA 內存排序為主,臨時表空間磁盤溢寫為輔。運維核心:適度配置 PGA 自動管理、專用本地管理臨時表空間、多文件分佈、監控溢寫 Top SQL、優化 SQL 減少不必要排序。