HWMが高い位置にあるってどうゆう状況?
例えば「住所マスタテーブル」を新規にCREATEし、1レコード1024バイトのデータを10万レコードINSERTしたとします。こと時1024×10万≒98Mバイト分のデータを格納するだけのブロックが消費され、HWMはこの最後のブロックを示します。この後5万レコード分DELETEした場合、有効なデータのサイズは半分になりますが、HWMはDELETE前の位置のままです。(これはOracleの仕様です。)このような状態をHWMが高いといいます。通常、テーブル(セグメント)のサイズはDBA_SEGMENTSディクショナリを参照し求めますが、上記のように半分のレコードをDELETEしてもサイズに変化はありません。「DBAさんから表領域がいっぱいになりそうなので、不要なデータを削除してください」と依頼をうけて、「はい、DELETE完了しました!」なんて返事してもちっとも領域は開放されないので注意しましょう。
HWMをなぜ下げる必要ある?
SQL実行プランで、テーブルフルスキャンが発生する場合HWMまでを読み込みます。上記の例では本来HWMが適切な位置にあれば5万件のデータを収めるだけのブロックをスキャンすればよいところ、倍のブロックをスキャンする事となります。
HWMはどうやって下げるの?
いくつか方法がありますのでシーンに合わせて使い分けます。
- 対象のテーブルデータを一旦別のテーブルに退避させておいてTRUNCATE & INSERT
- 対象のテーブルデータをエクスポート/インポートで入れ直す
- 対象のテーブルをMOVEする(11gまでならMOVEが利用できないのでrenameで一旦別名にしてからの処理となりMOVEよりも手数がかかります)
- ALTER TABLE XXXXX SHRINK を使う(セグメントの断片化解消も行えます)
実際のところHWMを下げる事を目的としてエクスポート/インポートを使う事はないと思います。他の方法に比べかなり敷居が高いです。エクスポート/インポートを行うと「結果HWMが下がる」という認識でよいとおもいます。ここでは最もお手軽と思われる ALTER TABLE XXXXX SHRINK の 利用方法を紹介します