DELETE文とTRUNCATE文の違い〜HWMの引き下げ

DELETE文であろうが、TRUNCATE文であろうが、データがテーブルから削除される点については同じで、いったい何が異なるのだろうか。

結論から述べると、

  • DELETE文を用いてもHWMの位置は変化しないが、TRUNCATE文を用いるとHWMはリセットされる。

ちなみに、HWMとは、High Water Markの略で、セグメントの使用済み領域の終端を表す。

さて、DELETEとTRUNCATEの違いは分かったが、HWMの位置リセットすると何が嬉しいのだろうか。
SELECT文で、セグメントの全データを取得する場合は、セグメントの最初の位置からHWMまでのデータを取得する。なので、DELETE文によって、HWMの位置は不変だが、使用領域とHWMの間に未使用領域があると、無駄な処理を行っていることになる。その場合、TRUNCATE文の実行によってテーブルを切り捨てた後に(HWMをリセットした後に)データを再投入すると無駄な処理が減る。、