はじめに
セグメントアドバイザの情報を使って、断片化情報を取得することができる。
内容
前提
実行環境は以下となる。
- OSバージョン
- Windows Server 2016 Standard
- Oracle Databaseバージョン
- Oracle Database 12C
利用場面
テーブルまたはインデックスのデータ格納において、断片化が発生し、領域を利用する上で無駄がないかを確認することができる。
領域が断片化していることで、テーブルが実データ以上の領域を確保している状態となり、領域圧迫の原因になる。
セグメントアドバイザの情報を確認することで、無駄に領域を確保しているテーブルが特定でき、そのテーブルを断片化解消することで、空き領域を確保することができる。
取得方法
以下のクエリを実行する。
SELECT A.TABLESPACE_NAME
, A.SEGMENT_OWNER
, A.SEGMENT_NAME
, B.TABLE_NAME
, A.SEGMENT_TYPE
, A.RECOMMENDATIONS
, A.C1
FROM TABLE(DBMS_SPACE.ASA_RECOMMENDATIONS('TRUE', 'TRUE', 'FALSE')) A
LEFT JOIN DBA_INDEXES B
ON A.SEGMENT_NAME = B.INDEX_NAME
ORDER BY SEGMENT_OWNER, SEGMENT_NAME, SEGMENT_TYPE
注意点
セグメントアドバイザの情報はあくまで、空きが確保できる可能性をアドバイスしているものであり、クエリの取得結果通りに、領域が解放されるわけではない。
SHRINKコマンドまたは、MOVEコマンドなど、断片化解消をおこなう手段によって領域の空きが全くできない可能性もある。
※MOVEコマンドはテーブルの作り直しのため、断片化は見込み通りに解消することが多いが、SHRINKコマンドの場合は、領域の使われ方によって、HWM(ハイウォーターマーク)下がりにくい傾向にあるため、見込み通りに領域が解消されないことがある。
まとめ
上記のクエリで断片化しているテーブルが分かるため、対象テーブルに対してSHRINKコマンドやMOVEコマンドを実行することで、断片化を解消し、空き領域を確保することができる。
コメント