【Oracle】表領域の使用状況を確認する SQL まとめ|使用率・AUTOEXTEND・TEMP/UNDO・閾値アラート・増加傾向まで解説

【Oracle】表領域の使用状況を確認する SQL まとめ|使用率・AUTOEXTEND・TEMP/UNDO・閾値アラート・増加傾向まで解説 Oracle

Oracle データベースの運用で表領域の容量不足は最も多い障害原因の 1 つです。容量が枯渇すると ORA-01653(表を拡張できません)やORA-01654(索引を拡張できません)が発生し、INSERT や UPDATE が停止します。

本記事では、表領域の使用状況を確認するSQL を目的別に完全網羅します。基本の使用率確認AUTOEXTEND を考慮した実質使用率TEMP / UNDO 表領域の確認閾値超過アラート SQL増加傾向の分析まで、コピーしてすぐ使える実用的な SQL を提供します。

この記事でわかること
・表領域の使用率を確認する基本 SQL
・AUTOEXTEND(自動拡張)を考慮した実質使用率の計算
・DBA_TABLESPACE_USAGE_METRICS による簡易確認
・データファイル別の使用率確認
・TEMP 表領域 / UNDO 表領域の使用状況確認
・使用率 80% 超の表領域を検出する閾値アラート SQL
・DBA_HIST_TBSPC_SPACE_USAGE による増加傾向の分析
・PL/SQL による自動監視スクリプト
スポンサーリンク

表領域の使用率を確認する(基本)

SQL(使用率の基本クエリ)
-- 表領域ごとの合計サイズ / 使用サイズ / 空きサイズ / 使用率
SELECT
    df.tablespace_name,
    ROUND(df.total_mb, 1) AS total_mb,
    ROUND(df.total_mb - NVL(fs.free_mb, 0), 1) AS used_mb,
    ROUND(NVL(fs.free_mb, 0), 1) AS free_mb,
    ROUND((df.total_mb - NVL(fs.free_mb, 0)) / df.total_mb * 100, 1) AS used_pct
FROM
    (SELECT tablespace_name, SUM(bytes)/1024/1024 AS total_mb
     FROM dba_data_files GROUP BY tablespace_name) df
LEFT JOIN
    (SELECT tablespace_name, SUM(bytes)/1024/1024 AS free_mb
     FROM dba_free_space GROUP BY tablespace_name) fs
ON df.tablespace_name = fs.tablespace_name
ORDER BY used_pct DESC;

出力例:

TABLESPACE_NAME TOTAL_MB USED_MB FREE_MB USED_PCT
USERS 1024.0 921.6 102.4 90.0
SYSTEM 800.0 640.0 160.0 80.0
SYSAUX 500.0 350.0 150.0 70.0
このクエリは「現在のファイルサイズ」ベースの使用率
AUTOEXTEND が ON のデータファイルは、まだ拡張の余地があります。「使用率 90% だが AUTOEXTEND で 32GB まで拡張可能」なら、実質的な危険度は低いです。次のセクションの AUTOEXTEND 考慮版を使う方が実践的です。

AUTOEXTEND を考慮した実質使用率

SQL(AUTOEXTEND 考慮版: 最大拡張可能サイズベース)
-- AUTOEXTEND ON のファイルは maxbytes を上限として使用率を計算
SELECT
    df.tablespace_name,
    ROUND(df.current_mb, 1) AS current_mb,
    ROUND(df.max_mb, 1) AS max_mb,
    ROUND(df.current_mb - NVL(fs.free_mb, 0), 1) AS used_mb,
    ROUND((df.current_mb - NVL(fs.free_mb, 0)) / df.max_mb * 100, 1)
        AS used_pct_of_max
FROM
    (SELECT tablespace_name,
            SUM(bytes)/1024/1024 AS current_mb,
            SUM(CASE WHEN autoextensible = 'YES'
                     THEN GREATEST(maxbytes, bytes)
                     ELSE bytes END)/1024/1024 AS max_mb
     FROM dba_data_files
     GROUP BY tablespace_name) df
LEFT JOIN
    (SELECT tablespace_name, SUM(bytes)/1024/1024 AS free_mb
     FROM dba_free_space
     GROUP BY tablespace_name) fs
ON df.tablespace_name = fs.tablespace_name
ORDER BY used_pct_of_max DESC;
AUTOEXTEND 考慮版が本番監視の定番
current_mb: 現在のファイルサイズ(AUTOEXTEND 前)
max_mb: AUTOEXTEND で拡張可能な最大サイズ
used_pct_of_max: 最大サイズに対する使用率
この値が 80% を超えたら対処を検討すべきです。

DBA_TABLESPACE_USAGE_METRICS(簡易版)

Oracle 11g 以降では DBA_TABLESPACE_USAGE_METRICS ビューでAUTOEXTEND を考慮した使用率を1 行のクエリで取得できます。

SQL(簡易版: 1 行クエリ)
-- Oracle が AUTOEXTEND を考慮して計算してくれる
SELECT tablespace_name,
       ROUND(used_space * 8192 / 1024 / 1024, 1) AS used_mb,
       ROUND(tablespace_size * 8192 / 1024 / 1024, 1) AS max_mb,
       ROUND(used_percent, 1) AS used_pct
FROM dba_tablespace_usage_metrics
ORDER BY used_percent DESC;

-- used_space / tablespace_size はブロック単位
-- 8192 = デフォルトのブロックサイズ(8KB)
-- ブロックサイズが異なる場合は DB_BLOCK_SIZE を確認
ブロックサイズの確認
DBA_TABLESPACE_USAGE_METRICS の値はブロック単位です。MB に変換するにはブロックサイズ(通常 8192 バイト)を掛けます。SHOW PARAMETER db_block_size でブロックサイズを確認してください。

データファイル別の使用率

SQL(データファイル単位の詳細)
SELECT
    df.tablespace_name,
    df.file_name,
    ROUND(df.bytes/1024/1024, 1) AS file_mb,
    ROUND((df.bytes - NVL(fs.free_bytes, 0))/1024/1024, 1) AS used_mb,
    ROUND(NVL(fs.free_bytes, 0)/1024/1024, 1) AS free_mb,
    df.autoextensible AS autoext,
    ROUND(df.maxbytes/1024/1024, 1) AS max_mb
FROM dba_data_files df
LEFT JOIN (
    SELECT file_id, SUM(bytes) AS free_bytes
    FROM dba_free_space
    GROUP BY file_id
) fs ON df.file_id = fs.file_id
ORDER BY df.tablespace_name, df.file_name;
データファイルレベルの確認が必要な場面
・1 つの表領域に複数のデータファイルがある場合(どのファイルが満杯か特定)
・AUTOEXTEND の ON/OFF がファイルごとに異なる場合
・特定のディスクの空き容量と突き合わせる場合

TEMP 表領域の使用状況

SQL(TEMP 表領域の使用状況)
-- TEMP 表領域の使用率
SELECT
    tablespace_name,
    ROUND(tablespace_size/1024/1024, 1) AS total_mb,
    ROUND(allocated_space/1024/1024, 1) AS alloc_mb,
    ROUND(free_space/1024/1024, 1) AS free_mb,
    ROUND(allocated_space/tablespace_size * 100, 1) AS used_pct
FROM dba_temp_free_space;

-- TEMP を使用しているセッション別の内訳
SELECT
    s.sid, s.serial#, s.username,
    ROUND(t.blocks * 8192/1024/1024, 1) AS temp_mb,
    s.sql_id,
    SUBSTR(q.sql_text, 1, 80) AS sql_text
FROM v$sort_usage t
JOIN v$session s ON t.session_addr = s.saddr
LEFT JOIN v$sql q ON s.sql_id = q.sql_id
ORDER BY t.blocks DESC;

TEMP 表領域の肥大化対策は「TEMP 表領域の肥大化を防ぐ方法」を参照してください。

UNDO 表領域の使用状況

SQL(UNDO 表領域の使用状況)
-- UNDO 表領域の使用率(ステータス別)
SELECT
    tablespace_name,
    status,
    ROUND(SUM(bytes)/1024/1024, 1) AS mb
FROM dba_undo_extents
GROUP BY tablespace_name, status
ORDER BY tablespace_name, status;
-- status: ACTIVE(使用中)/ UNEXPIRED(保持中)/ EXPIRED(再利用可能)

-- UNDO の残り保持時間
SHOW PARAMETER undo_retention;
-- undo_retention = 900(秒)→ 15 分間の UNDO を保持
UNDO status 意味 再利用
ACTIVE アクティブなトランザクションが使用中 不可
UNEXPIRED undo_retention 期間内(フラッシュバッククエリ用に保持) 緊急時は再利用される
EXPIRED 保持期間を超えた(不要) 再利用可能

閾値超過アラート SQL

使用率が閾値(80% / 90% 等)を超えた表領域だけを検出する SQL です。日次バッチやジョブスケジューラで定期実行すれば、容量不足を事前に検知できます。

SQL(使用率 80% 超の表領域を検出)
-- 実質使用率(AUTOEXTEND 考慮)が 80% を超える表領域
SELECT tablespace_name,
       ROUND(used_percent, 1) AS used_pct
FROM dba_tablespace_usage_metrics
WHERE used_percent >= 80
ORDER BY used_percent DESC;
SQL(空き容量が 1GB 未満の表領域を検出)
-- 残り容量ベースでの閾値チェック
SELECT
    df.tablespace_name,
    ROUND(NVL(fs.free_mb, 0), 1) AS free_mb,
    ROUND((df.total_mb - NVL(fs.free_mb, 0)) / df.total_mb * 100, 1) AS used_pct
FROM
    (SELECT tablespace_name, SUM(bytes)/1024/1024 AS total_mb
     FROM dba_data_files GROUP BY tablespace_name) df
LEFT JOIN
    (SELECT tablespace_name, SUM(bytes)/1024/1024 AS free_mb
     FROM dba_free_space GROUP BY tablespace_name) fs
ON df.tablespace_name = fs.tablespace_name
WHERE NVL(fs.free_mb, 0) < 1024  -- 1GB 未満
ORDER BY free_mb;

増加傾向の分析(DBA_HIST_TBSPC_SPACE_USAGE)

SQL(表領域サイズの時系列推移: AWR)
-- 過去 7 日間の表領域使用量の推移(AWR スナップショット)
SELECT
    TO_CHAR(sn.begin_interval_time, 'YYYY-MM-DD') AS day,
    ts.tablespace_id,
    (SELECT tablespace_name FROM v$tablespace WHERE ts# = ts.tablespace_id) AS ts_name,
    ROUND(MAX(ts.tablespace_usedsize * 8192)/1024/1024, 1) AS used_mb
FROM dba_hist_tbspc_space_usage ts
JOIN dba_hist_snapshot sn ON ts.snap_id = sn.snap_id
WHERE sn.begin_interval_time >= SYSDATE - 7
GROUP BY TO_CHAR(sn.begin_interval_time, 'YYYY-MM-DD'), ts.tablespace_id
ORDER BY ts_name, day;
増加傾向の分析で「いつ枯渇するか」を予測する
日次の使用量推移を見れば、1 日あたりの増加量がわかります。残り容量 / 1 日あたりの増加量 = 枯渇までの推定日数として計算できます。80% に達する前にデータファイルの追加や AUTOEXTEND の上限変更を検討してください。
DBA_HIST_* は Enterprise Edition + Diagnostics Pack のライセンスが必要
Standard Edition では DBA_HIST 系ビューは使えません。代わりに日次バッチで使用量をログテーブルに記録し、独自に推移を追跡してください。

PL/SQL による自動監視スクリプト

SQL(閾値超過時にアラートテーブルに記録)
-- 閾値超過の表領域をアラートテーブルに記録するプロシージャ
CREATE OR REPLACE PROCEDURE check_tablespace_usage IS
    v_threshold NUMBER := 80;  -- 閾値: 80%
BEGIN
    FOR rec IN (
        SELECT tablespace_name,
               ROUND(used_percent, 1) AS used_pct
        FROM dba_tablespace_usage_metrics
        WHERE used_percent >= v_threshold
    ) LOOP
        INSERT INTO tablespace_alerts
            (tablespace_name, used_pct, check_date)
        VALUES
            (rec.tablespace_name, rec.used_pct, SYSDATE);
    END LOOP;
    COMMIT;
END;
/

-- DBMS_SCHEDULER で日次実行
BEGIN
    DBMS_SCHEDULER.CREATE_JOB(
        job_name   => 'JOB_CHECK_TABLESPACE',
        job_type   => 'PLSQL_BLOCK',
        job_action => 'BEGIN check_tablespace_usage; END;',
        start_date => TRUNC(SYSDATE) + 1 + 8/24,  -- 明日 8:00
        repeat_interval => 'FREQ=DAILY; BYHOUR=8',
        enabled    => TRUE
    );
END;
/

容量不足を検知した場合の対処

状況 対処法 SQL / コマンド
使用率 80% 超 データファイルの追加を計画 ALTER TABLESPACE ts ADD DATAFILE ‘/path/file.dbf’ SIZE 1G AUTOEXTEND ON
AUTOEXTEND が OFF AUTOEXTEND を ON にする ALTER DATABASE DATAFILE ‘/path/file.dbf’ AUTOEXTEND ON MAXSIZE 32G
AUTOEXTEND の上限に近い MAXSIZE を拡大、またはファイル追加 ALTER DATABASE DATAFILE ‘/path/file.dbf’ AUTOEXTEND ON MAXSIZE 64G
不要データが大量にある 不要テーブルの TRUNCATE / DROP TRUNCATE TABLE old_logs; / DROP TABLE temp_data PURGE;
断片化で空きが使えない 表領域の COALESCE またはテーブル MOVE ALTER TABLESPACE ts COALESCE; / ALTER TABLE t MOVE;

容量不足の緊急対応手順は「容量不足の緊急対応完全ガイド」、表領域の管理全般は「表領域(Tablespace)完全ガイド」を参照してください。

コピーして使える SQL 一覧

確認内容 ビュー / クエリ
表領域の使用率(基本) DBA_DATA_FILES + DBA_FREE_SPACE
AUTOEXTEND 考慮の使用率 DBA_DATA_FILES(maxbytes 使用)+ DBA_FREE_SPACE
使用率(簡易 1 行) DBA_TABLESPACE_USAGE_METRICS
データファイル別 DBA_DATA_FILES + DBA_FREE_SPACE(file_id 結合)
TEMP 表領域 DBA_TEMP_FREE_SPACE / V$SORT_USAGE
UNDO 表領域 DBA_UNDO_EXTENTS(status 別集計)
増加傾向(AWR) DBA_HIST_TBSPC_SPACE_USAGE(EE + Diagnostics Pack)
閾値超過検出 DBA_TABLESPACE_USAGE_METRICS WHERE used_percent >= 80

よくある質問

QDBA_FREE_SPACE に表領域が表示されません
ADBA_FREE_SPACE永続表領域の空き領域のみを表示します。TEMP 表領域は DBA_TEMP_FREE_SPACE、UNDO 表領域は DBA_UNDO_EXTENTS で確認してください。また、表領域が完全に使い切られている(空き 0)場合も表示されません。
Q使用率 90% でもまだ大丈夫ですか?
AAUTOEXTEND が ON で maxbytes に余裕があれば、Oracle が自動的にデータファイルを拡張するため即座に問題にはなりません。ただし、ディスク空き容量が不足していると拡張に失敗して ORA-01653 が発生します。AUTOEXTEND 考慮版の使用率と、OS のディスク空き容量の両方を確認してください。
QDBA_TABLESPACE_USAGE_METRICS のブロックサイズは?
Aused_spacetablespace_sizeブロック単位です。MB に変換するには * DB_BLOCK_SIZE / 1024 / 1024 を掛けます。デフォルトの DB_BLOCK_SIZE は 8192 バイト(8KB)です。SHOW PARAMETER db_block_size で確認してください。
QStandard Edition で増加傾向を分析するには?
ADBA_HIST 系ビュー(AWR)は Enterprise Edition + Diagnostics Pack が必要です。Standard Edition では、日次バッチで使用量を独自のログテーブルに記録し、推移を自前で追跡するのが一般的です。本記事の PL/SQL 自動監視スクリプトを参考にしてください。
QUNDO 表領域の UNEXPIRED が多いのは問題ですか?
AUNEXPIREDUNDO_RETENTION 期間内の UNDO データです。フラッシュバッククエリ(過去のデータの参照)に使われます。容量が不足すると Oracle が UNEXPIRED を自動的に再利用するため、通常は問題ありません。ただし UNDO_RETENTION が長すぎると不要な UNDO が溜まるので、業務要件に合った値に設定してください。
Q表領域の空きがあるのに ORA-01653 が出ます
A断片化が原因の可能性があります。空き容量は合計では十分でも、連続した空き領域(エクステント)が不足しているとテーブルを拡張できません。ALTER TABLESPACE ts COALESCE で連続領域を統合するか、ALTER TABLE t MOVE でテーブルを再配置してください。

まとめ

表領域の使用状況確認の要点をまとめます。

やりたいこと 推奨 SQL / ビュー
使用率を簡単に確認 SELECT tablespace_name, used_percent FROM DBA_TABLESPACE_USAGE_METRICS
AUTOEXTEND 考慮の使用率 DBA_DATA_FILES(maxbytes)+ DBA_FREE_SPACE
データファイル別の詳細 DBA_DATA_FILES + DBA_FREE_SPACE(file_id 結合)
TEMP 表領域の使用状況 DBA_TEMP_FREE_SPACE / V$SORT_USAGE
UNDO 表領域の使用状況 DBA_UNDO_EXTENTS(status 別集計)
閾値超過を検出 DBA_TABLESPACE_USAGE_METRICS WHERE used_percent >= 80
増加傾向を分析 DBA_HIST_TBSPC_SPACE_USAGE(EE + Diagnostics Pack)
自動監視 PL/SQL プロシージャ + DBMS_SCHEDULER