在 Oracle 資料庫日常運作中,排序、分組彙總、索引建立等操作會產生大量臨時資料。以員工資料表為例,資料依建立時間儲存,但使用者若以 ORDER BY 按員工編號排序,排序後的結果集即為臨時資料。Oracle 會優先嘗試將這些資料放入 PGA(Program Global Area)的排序區,但排序區容量有限,一旦不足,資料庫便會轉而使用臨時表空間。雖名為「臨時」,實則幾乎每個資料庫都離不開它,設定不當將嚴重拖垮效能。本文將從三大面向切入,說明如何合理規劃臨時表空間。
建議在 CREATE USER 時以 DEFAULT TEMPORARY TABLESPACE 子句為使用者指定專屬臨時表空間。若未指定,Oracle 會自動將臨時段建立在 SYSTEM 表空間,導致兩大隱憂:
SYSTEM 產生大量碎片,降低磁碟讀取效率。SYSTEM 空間本就有限,臨時段搶佔空間可能影響核心資料字典操作。因此,DBA 應養成「建使用者、配臨時表空間」的習慣,從源頭避免對系統表空間的干擾。
記憶體存取速度較磁碟快數千倍,理想情況是 PGA 足以容納所有排序作業。實務上可透過初始化參數 SORT_AREA_SIZE(或 10g 以降的 PGA_AGGREGATE_TARGET)調整排序區大小:
必要時可增加實體記憶體擴充 PGA。平時並應監控 V$SORT_SEGMENT 與 V$SORT_USAGE 動態視圖,掌握排序段使用狀況與佔用會話,作為效能調校依據。注意:同一 Instance 所有需排序的 SQL 共用同一排序段,段於首次使用時建立、Instance 關閉才釋放,分析時須結合兩視圖綜合判讀。
一般資料檔案建立時即全額配置空間,但臨時檔案(Linux/Unix 下)屬「稀疏檔案」,建立時不佔實際磁碟,僅在寫入資料時動態配置。若磁碟剩餘空間不足,寫入瞬間將失敗,導致排序作業中斷甚至資料庫掛起。建議:
DBA_TEMP_FILES 搭配作業系統指令檢查實際使用量。AUTOEXTEND 並設定 MAXSIZE 上限,防止單一巨大排序撐爆磁碟。臨時表空間雖非永久儲存物件,卻是資料庫排序、雜湊連線、索引建立等核心運算的「幕後推手」。透過指定專用表空間、調大 PGA、預留磁碟三管齊下,即可將其負面影響降至最低,確保資料庫長期穩定高效運作。