データベース PR

【SQLデータ削除】DELETEとTRUNCATEの違い

記事内に商品プロモーションを含む場合があります

SQLの基本は知っているつもりでしたが、
こんなのあったんだ!というのがあったのでメモ!

データ削除操作には主にDELETEとTRUNCATEの2つのコマンドがあり、
これらのコマンドは表(テーブル)からデータを削除する点では共通していますが、
使用方法、パフォーマンス、副作用には大きな違いがあります。

本記事では、DELETEとTRUNCATEの概要からメリット・デメリット、
使い分けについて初心者にもわかりやすく解説します。
※DELETE使いがちですが、TRUNCATEの方がメリットありそうでした。

DELETEコマンド

概要

DELETEは、指定した条件に一致する行をテーブルから削除します。
条件を指定しない場合、テーブル内の全行を削除しますが、テーブル領域は保持されます。

DELETE FROM (テーブル名);
DELETE FROM (テーブル名) WHERE (条件);

詳細

  • 条件に一致する特定の行のみを削除することができます。
  • トランザクションの一部として実行することができ、
    削除操作をロールバックして元に戻すことが可能です。
  • 削除される各行に対してトリガーが実行されます。
  • ハイウォーターマーク(HWM)も割り当て領域もクリアしません。

DBにおけるHWM(High Water Mark)とは?

データベースのテーブルや
インデックスなどのセグメントに対するHWMは、
そのセグメントが一度でも占有した領域の上限(最大使用地点)を指します。具体的には、以下のような意味があります

  • テーブルにデータが挿入されると、HWMが増加します。
  • データが削除された場合、
    物理的な領域は解放されず、HWMは減少しません。
    ただし、テーブルの再編成などを行うことでHWMをリセットし、
    未使用領域を解放することが可能です。
  • HWMより下の領域はデータが存在する可能性があるためスキャンされますが、HWMより上の領域は未使用とみなされます。

メリット

  • 条件を細かく指定して特定のデータのみを削除できる柔軟性があります。
  • 削除操作を取り消すことができます(ロールバック可能)。

デメリット

  • 大量のデータを削除する場合、
    パフォーマンスが低下することがあります。
    ※HWMがクリアされていないため、
     実データ数は少ないのに検索処理時間がかかる可能性がある。
  • 上と似てますが、TRUNCATEに比べて処理が遅いです。
  • テーブル内のデータを全て削除する場合でも、
    空のページがテーブルに残ることがあります。

TRUNCATEコマンド

概要

TRUNCATEは、テーブル内の全行を高速に削除し、
テーブルを初期化するコマンドです。
WEHRE句による条件指定はできません。

TRUNCATE TABLE (テーブル名);

TRUNCATEは一度テーブルをDROPして
テーブルを再作成するという動きをします

詳細

  • テーブルから全ての行を削除しますが、
    テーブル構造とインデックスは保持されます。
  • トランザクションログを少なく消費し、
    削除操作を高速に行うことができますが、
    通常はロールバックできません(一部のDBMSでは可能)。

メリット

  • 大量のデータを含むテーブルを迅速にクリアすることができます。
    ※DELETEに比べ圧倒的に早い!
  • テーブルをリセットするのに適しており、パフォーマンスが高いです。
  • ハイウォーターマーク(HWM)をクリアします。
    ※割り当て領域のクリアはオプションで選択可能

デメリット

  • 条件を指定して特定のデータのみを削除することはできません。
  • 一部のDBMSを除き、
    実行後に操作をロールバックすることはできません。

使い分け

  • DELETE:
    特定の条件に基づいてデータを削除したい場合や、
    削除操作をロールバックする可能性がある場合に適しています。
  • TRUNCATE:
    テーブル内のデータをすべて高速に削除し、
    テーブルを初期状態に戻したい場合に適しています。
    ただし、削除操作を元に戻すことはできないため、使用には注意が必要です。

適切なコマンドの選択は、操作の目的とパフォーマンスの要件によって異なります。
データの安全性を確保しつつ、効率的にデータ管理を行うために、
これらの違いを理解し、適切に使い分けることが重要です。

参考:DROPコマンド

概要

削除という意味では
DROPコマンドもありますので、書いておきます!

完全に削除するのでロールバックができません。
テーブルも残りませんので、ご注意ください!

DROP TABLE (テーブル名);


このコマンドは、テーブル以外に、
ビュー、データベースなどにも使えます(完全に削除します。)

メリット

  • テーブルやデータベースが完全に不要になった場合、
    データを個別に消す操作を行う必要がなく、
    シンプルかつ確実に全てを削除できる。
  • 大量のデータが入っているテーブルを削除したい場合でも、
    行ごとに削除するDELETEよりも、
    DROPは一気に処理が進むため、非常に高速。
  • ディスクスペースが必要な場合、
    DELETEでは行データが消えるだけで、テーブル構造は残ります。
    TRUNCATEでもテーブルの定義は残りますが、
    DROPを使うとスペースが完全に解放されます。

デメリット

  • テーブル自体が完全に削除されるため、
    インデックスや制約、参照関係も全て消えます。
  • 一部のデータベースではトランザクションをサポートしないため、
    DROP操作は元に戻せない場合が多い(ロールバック不可能)。

まとめ

本記事では、
データ削除操作のDELETETRUNCATE
おまけでDROPの3つのコマンドをご紹介しました。

これらのコマンドは表(テーブル)から
データを削除する点では共通していますが、
使用方法、パフォーマンス、副作用には大きな違いがあります。

以下、まとめです!

操作対象削除対象ロールバックパフォーマンステーブル構造
DELETEテーブルの行条件に合う行可能行ごとに削除するため遅い構造は維持
TRUNCATEテーブル全体の行全ての行一部のDBでは不可高速(全行削除)構造は維持
DROPテーブルまたはデータベーステーブル全体・データベース全体不可高速(構造ごと削除)構造ごと削除


DELETEとTRUNCATEのメリット・デメリットを考慮し、
使い分けていきましょう〜。

誰かの参考になれば幸いです!