TRUNCATEと全件DELETEの違い

ORACLE
20160219-1

TRUNCATE TABLE文と条件なしでのDELETE文を違いを本記事では解説します。
両方ともテーブル内の全データを削除するという点では同じですが、処理時間や割り当て領域・HWMのクリアといったところに差異があるので、詳しく見ていきます。

全データを削除するという点では同じ

TRUNCATE TABLE文と条件なしでのDELETE文は、全データを削除するという点では同じです。

-- 削除前確認
SELECT COUNT(*) FROM test_table1;

 COUNT(*)
---------
  1000000

SELECT COUNT(*) FROM test_table2;

 COUNT(*)
---------
  1000000

-- 全件削除
TRUNCATE TABLE test_table1;

DELETE FROM test_table2;
COMMIT;

-- 削除後確認
SELECT COUNT(*) FROM test_table1;

 COUNT(*)
---------
        0

SELECT COUNT(*) FROM test_table2;

 COUNT(*)
---------
        0

処理時間の差異

削除する際の処理時間は、圧倒的にTRUNCATE TABLE文が早いです。

TRUNCATE TABLE文は、1秒以内~数秒程度で処理出来ますが、DELETE文はかなりの時間がかかります。(データ量によっては10分以上かかるケースも)

割り当て領域・HWMのクリアの差異

TRUNCATE TABLE文は、ハイウォーターマーク(HWM)をクリアし、割り当て領域のクリアはオプションで選択できます。
DELETE文は、HWMも割り当て領域もクリアしません。

大量にDELETEした後は、HWMがクリアされていないため、実データ数は少ないにもかかわらず検索に処理時間がかかるといった現象が起こります。

-- テーブル1(TRUNCATE TABLE、割り当ては解除)
TRUNCATE TABLE test_table1 DROP STORAGE;
-- テーブル2(TRUNCATE TABLE、割り当ては保持)
TRUNCATE TABLE test_table2 REUSE STORAGE;
-- テーブル3(DELETE)
DELETE FROM test_table3;
COMMIT;

-- 削除前の全件検索処理時間
テーブル1:9.09秒
テーブル2:9.17秒
テーブル3:9.18秒

-- 削除後の全件検索処理時間
テーブル1:0.56秒
テーブル2:0.36秒
テーブル3:8.48秒

※処理時間は、環境に大きく影響されます。あくまでも一例として見て下さい。

TRUNCATE TABLE文はDDL、DELETE文はDML

TRUNCATE TABLE文はDDL(データ定義言語)の一種です。
そのため、実行前に暗黙的にCOMMITがかかる点で注意が必要です。
また、実行後にCOMMITは不要で、ROLLBACKで戻せない点も注意が必要です。

DELETE文はDML(データ操作言語)の一種です。
そのため、処理を確定するためにはCOMMITが必要で、ROLLBACKで戻すことも可能です。

必要な権限が異なる

TRUNCATE TABLE文はDROP権限が必要ですが、DELETE文はDELETE権限が必要です。

必要な権限が異なる点に注意が必要です。

まとめ

TRUNCATE TABLE文と条件なしでのDELETE文の違いを見てきました。
特に処理時間の違いとHWMがDELETE文ではクリアされない点に注意が必要です。
必要に応じて使い分けましょう。

関連

タイトルとURLをコピーしました