2017/12/07
ORACLEを運用していると、セグメント(テーブルやインデックス)に割り当てられている領域がどのくらいあるのか把握する必要があります。
格納しているテーブルスペースが溢れないかを定期的にチェックし、溢れる危険性がある時は、テーブルスペースの拡張、場合によっては物理的な記憶領域(HDDなど)を拡張する必要があります。
本記事では、セグメントに割り当てられている領域の取得方法を紹介します。
sponsored link
割り当てられている領域の取得方法
セグメント(テーブルやインデックス)に割り当てられている領域の取得のために、静的データディクショナリビューのUSER_SEGMENTS、または、DBA_SEGMENTSを検索します。
USER_SEGMENTSは、接続しているユーザーに属するセグメントの情報を確認できます。DBA_SEGMENTSは、全セグメントの情報を確認できますが、DBAロールが付与されているユーザーでないと検索できません。
DBA_SEGMENTSは、SYSTEMやUNDOといったシステム系の領域情報も出力されるので、不要な場合は除外が必要です。
以下、具体的な検索SQLとサンプルの出力結果です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
SELECT SEGMENT_NAME -- セグメント名 ,PARTITION_NAME -- パーティション名 ,SEGMENT_TYPE -- セグメントのタイプ ,TABLESPACE_NAME -- テーブルスペース名 ,ROUND(BYTES/1024/1024,2) MBYTES -- サイズ(Mバイト単位) FROM DBA_SEGMENTS ; SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME MBYTES --------------- ----------------- ---------------- --------------- -------- TEST_TABLE1 TABLE TSDAT01 1307.19 TEST_TABLE2 TABLE TSDAT01 1307.19 TEST_TABLE3 TEST_TABLE3_01 TABLE PARTITION TSDAT01 653.59 TEST_TABLE3 TEST_TABLE3_02 TABLE PARTITION TSDAT01 653.59 PK_TEST_TABLE1 INDEX TSIDX01 304.12 PK_TEST_TABLE2 INDEX TSIDX01 304.12 PK_TEST_TABLE3 PK_TEST_TABLE3_01 INDEX PARTITION TSIDX01 152.06 PK_TEST_TABLE3 PK_TEST_TABLE3_02 INDEX PARTITION TSIDX01 152.06 |
SEGMENT_NAMEには、テーブル名やインデックス名が入ります。
PARTITION_NAMEには、パーティション化されているテーブル・インデックスの場合、パーティション名が入ります。
SEGMENT_TYPEにて、テーブルやインデックスの判断、パーティション化されているのかの判断が出来ます。
TABLESPACE_NAMEには、テーブルスペースが入ります。
BYTESには、割り当てられている領域サイズがバイト単位で入ります。
注意点
このSQLで確認できるのは、あくまでも割り当てられた領域のサイズになります。実際にデータが格納されている領域のサイズではないことに注意が必要です。
例えば、データをDELETE文で大量に削除した場合、割り当てられた領域は解放されないため、差異が生じます。(DELETEでは、HWMもクリアされないため、検索時は削除前の領域全すべてを走査します)
また、割当を保持してテーブルをトランケートした場合(REUSE STRAGE)も差異が生じます。(こちらはHWMはクリアされる)
まとめ
セグメントに割り当てられている領域サイズは、静的データディクショナリビューのUSER_SEGMENTS、または、DBA_SEGMENTSを検索することで確認できます。
テーブルスペースサイズの決定や、運用中のテーブルスペースの残領域に問題がないかの検討で、上記ディクショナリビューを確認してみましょう。