😺

DELETEとTRUNCATEの違い

2024/09/04に公開

はじめに

このページではSQLにおけるDELETETRUNCATEの違いについて記述します。

DELETETRUNCATEの違い

DELETETRUNCATEは、SQLにおいてテーブルからデータを削除するために使用されるコマンドですが、それぞれの動作やパフォーマンスに大きな違いがあります。以下では、それぞれのコマンドの特徴と使用例について詳しく説明します。

1. DELETE コマンド

DELETEコマンドは、テーブル内の特定の行を削除するために使用されます。WHERE句を使用することで、削除する行を条件に基づいて選択することができます。

構文

DELETE FROM テーブル名 WHERE 条件;

usersテーブルからageが30以上のユーザーを削除する場合:

DELETE FROM users WHERE age >= 30;

特徴

  • 行ごとに削除: DELETEは指定した条件に基づいて、行ごとに削除を行います。
  • トランザクションのサポート: DELETEはトランザクションの一部として使用できます。そのため、COMMITROLLBACKを使って操作を確定または取り消すことができます。
  • トリガーが実行される: DELETE操作では、関連するトリガー(AFTER DELETEなど)が実行されます。
  • 削除の速度: DELETEは行ごとにロックをかけるため、大量のデータを削除する際はパフォーマンスが低下することがあります。

2. TRUNCATE コマンド

TRUNCATEコマンドは、テーブルのすべての行を削除し、テーブルを初期化するために使用されます。TRUNCATEDELETEと異なり、個々の行を削除するのではなく、テーブル全体をリセットします。

構文

TRUNCATE TABLE テーブル名;

usersテーブルのすべてのデータを削除する場合:

TRUNCATE TABLE users;

特徴

  • 全行削除: TRUNCATEはテーブル内のすべての行を削除しますが、テーブルの構造(列やインデックスなど)は保持されます。
  • 高速な操作: TRUNCATEはテーブルのデータページを直接リセットするため、DELETEよりも高速です。
  • トランザクションとトリガーの制限: 一部のデータベースではTRUNCATEはトランザクション内で使用できなかったり、トリガーが実行されない場合があります。
  • 自動コミット: TRUNCATEは通常、自動的にコミットされ、ROLLBACKで取り消すことはできません。

3. パフォーマンスの違い

DELETETRUNCATEのパフォーマンスの違いは、削除の方式に大きく依存します。

  • DELETEは、行ごとに削除を行い、削除された各行についてトランザクションログを記録します。これにより、削除する行数が増えるとパフォーマンスが低下します。
  • TRUNCATEは、テーブル全体を一度に削除するため、トランザクションログにはページの解除だけが記録されます。このため、DELETEよりもはるかに高速です。

4. コマンドの比較

特徴 DELETE TRUNCATE
削除対象 条件で指定した行 テーブル内の全ての行
トランザクション対応 対応(COMMITROLLBACKが可能) 自動コミット(通常はROLLBACK不可)
トリガー実行 実行される 実行されない場合がある
パフォーマンス 行ごとに削除されるため、大量データでは遅い ページ単位で削除されるため高速
テーブルの構造 保持される 保持される

まとめ

DELETETRUNCATEはどちらもテーブルからデータを削除するためのコマンドですが、使い方やパフォーマンスの点で大きな違いがあります。条件に基づいて特定の行を削除したい場合はDELETEを使用し、テーブルのすべてのデータを一度に削除したい場合はTRUNCATEを使用すると良いでしょう。それぞれの特徴を理解し、適切なシナリオで使い分けることが重要です。

Discussion