DELETEとTRUNCATEは、データを削除するということは、
同じなので違いを簡単にご説明します。
状況に応じて使い分けるのが大切です。
ロールバック出来るか?出来ないかの違い
DELETEは、ロールバック出来ます。
TRUNCATEは、ロールバック出来ません。
ハイウォーターマーク(HWM)の違い
DELETEは、ハイウォーターマークがリセットされません。
TRUNCATEは、リセットされます。
ハイウォーターマーク(HWM)とは?
パフォーマンスを意識する時以外は、気にしません。
一言でいうと、
テーブルにどれだけデータが入っているの?という目安のマークになります。
え?だから?って思いますがw
私も始めて聞いたときに、え?だから?って思いましたw
OracleがSQLを実行する時に、テーブルに対して、FULL SCANした場合のパフォーマンスに大きく影響します。
FULL SCANするとどうなるの?
名前の通り、テーブルの全レコードをSCAN(=チェック)します。
その時に、HWMのマークまでチェックします。
カンの良い方は、あれ?テーブルのデータ件数を元にチェックすればいいじゃん!
って思いませんか?
私も思いました。
ただ、コレがややこしいので、詳しくは割愛していまいますが、HWMのマーク位置を使用します。
で、話を戻すと、DELETEとだとHWMがリセットされません。
そうすると、100件データを削除しても、FULL SCAN上、100件があるだろうな~って思って、検索をします。
ただ、データは無いので抽出はされないのですが、100件分のデータ領域まで検索してしまいます。
あら、不思議。
なので、FULL SCANした場合の検索速度が遅くなります。
使い分けのポイント
後続の作業の有無の違いです。
具体的には、
1.バックアップ取得
2.データを削除
3.その後、諸々作業
で、3で失敗した時に、2もリセットしたい場合、等は、「DELETE」一択です!
1.バックアップ取得
2.データを削除
までなら、「TRUNCATE」一択です!
違いを把握して、使い分けてください。