ハイウォータマーク(HWM)とは
セグメント内の位置を示しており、
その位置を超えるデータブロックは使用されていないということを表しています。
下のHWMのイメージ図にあるようにHWMを境目として、
それ以降(右側)のブロックデータは未フォーマットで使用されていません。
イメージ図のHWMより左側にある割当済みのブロックは以下の3つのいずれかの状態です。
1.割当て済ですが、現時点では未フォーマットで使用されていません。
2.フォーマット済でデータが格納されています。
3.フォーマット済ですが、データが削除されたため空です。
HWMによるパフォーマンスの違い
データ検索のテーブルフルスキャン時には、1ブロック目からHWMまでの間を読み込みます。
データ読み込みのイメージ図のHWMより左側にあるブロックは割当済みのブロックではありますが、
必ずしもデータが格納されているとは限りません。
「1.割当て済ですが、現時点では未フォーマットで使用されていません。」の場合と
「3.フォーマット済ですが、データが削除されたため空です。」の場合ですね。
データ読み込みのイメージ図では、9ブロック目までしかデータがないにもかかわらず、HWMまで読み込みが発生します。
この無駄な読み込みがパフォーマンスに影響を与える可能性があります。
HWMを下げる(イメージ図でいう左側に移動)ことにより実際のデータとHWMとの乖離をなくし、無駄な読み込みをなくすことができます。
HWMを下げるためには
データ読み込みのパフォーマンス向上のためにHWMを下げるためには、2つの方法があります。
1.「TRUNCATE TABLE」の実行
2.「ALTER TABLE SHRINK SPACE」の実行
「TRUNCATE TABLE」の実行によるハイウォータマーク(HWM)
以前にTRUNCATE TABLEの基本的な構文については記事を書いているのでそちらを参照してください。
テーブルのデータ削除 TRUNCATE TABLE
TRUNCATE TABLEを実行するとHWMは、先頭ブロックに移動します。
ただし、データを全件削除してしまうので実行については、注意してください。
「ALTER TABLE SHARINK SPACE」の実行によるハイウォータマーク(HWM)
セグメントの断片化を解消してHWMを下げます。
ただし、Oracle 10g以降のバージョンで使えるそうです。
「ALTER TABLE SHRINK SPACE」を実行するためには、
行移動を使用可能にする必要があります。
ALTER TABLE TEST_TABLE ENABLE ROW MOVEMENT;
SQL> ALTER TABLE TEST_TABLE ENABLE ROW MOVEMENT; 表が変更されました。
以下のSQLは、「TEST_TABLE」テーブルの断片化を解消しHWMを下げます。
ALTER TABLE TEST_TABLE SHRINK SPACE;
SQL> ALTER TABLE TEST_TABLE SHRINK SPACE; 表が変更されました。
コメント