Oracleデータベースでソートやハッシュ結合、大量データの一時操作を行う際、一時的な作業領域として使用されるのがTEMP表領域です。このTEMP表領域は、処理の規模や設計によって肥大化することがあり、放置しておくとディスクを圧迫し、他の処理にも悪影響を及ぼします。
本記事では、TEMP表領域の肥大化の原因、現在の使用状況の確認方法、クリーンアップや自動管理の方法について詳しく解説します。
TEMP表領域が肥大化する主な原因
TEMP表領域が大きくなる主な要因は以下の通りです。
- ORDER BYやGROUP BY、大規模なJOIN処理による一時データの増加
- インデックス作成や分析関数によるソート処理
- SQLチューニング不足による無駄なワーク領域の確保
TEMP表領域は自動的には縮小されないため、一度使用されたスペースは再利用可能でも物理的なファイルサイズとして残り続けます。
TEMP表領域の使用状況を確認するSQL
現在どれだけTEMP表領域が使用されているかを確認するには、以下のSQLを使用します。
SELECT tablespace_name,
SUM(blocks) * TO_NUMBER(value) / 1024 / 1024 AS used_mb
FROM v$sort_usage, v$parameter
WHERE name = 'db_block_size'
GROUP BY tablespace_name;
このクエリにより、現在アクティブなセッションによって使用されているTEMPのサイズ(MB)が確認できます。
TEMP表領域をクリーンアップする方法
TEMP表領域は基本的にセッション終了後に自動で開放されますが、サイズは縮小されません。使用後の肥大化をリセットするには、以下のように一時ファイルを再作成する方法が有効です。
-- 一時ファイルの削除
ALTER TABLESPACE temp DROP TEMPFILE '/u01/app/oracle/oradata/ORCL/temp01.dbf';
-- 新しい一時ファイルの追加
ALTER TABLESPACE temp ADD TEMPFILE '/u01/app/oracle/oradata/ORCL/temp01.dbf' SIZE 500M REUSE AUTOEXTEND ON NEXT 100M MAXSIZE 2G;
この操作は業務時間外など安全なタイミングで行う必要があります。セッションの使用がない状態で行うのが望ましいです。
肥大化防止のための対策
TEMP表領域の肥大化を未然に防ぐには、以下のような対応が効果的です。
- 適切なSQLチューニングで一時領域の使用を最小限に抑える
- TEMP表領域のサイズを適切に制限する(
MAXSIZE
の設定) - 定期的に
v$sort_usage
を監視して過剰使用を早期に察知する - 自動拡張の設定を制御することで際限のない肥大化を防ぐ
まとめ
TEMP表領域は、Oracleのパフォーマンスと可用性に直結する重要な領域です。処理の最適化と定期的な監視に加えて、不要な肥大化が起こった際の対処手順を習得しておくことで、トラブルを未然に防ぐことができます。
開発・検証環境では、スケジュールされたメンテナンスとして一時ファイルの再作成を取り入れる運用も検討しましょう。