SQLの基本は知っているつもりでしたが、
こんなのあったんだ!というのがあったのでメモ!
データ削除操作には主にDELETEとTRUNCATEの2つのコマンドがあり、
これらのコマンドは表(テーブル)からデータを削除する点では共通していますが、
使用方法、パフォーマンス、副作用には大きな違いがあります。
本記事では、DELETEとTRUNCATEの概要からメリット・デメリット、
使い分けについて初心者にもわかりやすく解説します。
※DELETE使いがちですが、TRUNCATEの方がメリットありそうでした。
DELETEコマンド
概要
DELETE
は、指定した条件に一致する行をテーブルから削除します。
条件を指定しない場合、テーブル内の全行を削除しますが、テーブル領域は保持されます。
DELETE FROM (テーブル名);
DELETE FROM (テーブル名) WHERE (条件);
詳細
- 条件に一致する特定の行のみを削除することができます。
- トランザクションの一部として実行することができ、
削除操作をロールバックして元に戻すことが可能です。 - 削除される各行に対してトリガーが実行されます。
- ハイウォーターマーク(HWM)も割り当て領域もクリアしません。
メリット
- 条件を細かく指定して特定のデータのみを削除できる柔軟性があります。
- 削除操作を取り消すことができます(ロールバック可能)。
デメリット
- 大量のデータを削除する場合、
パフォーマンスが低下することがあります。
※HWMがクリアされていないため、
実データ数は少ないのに検索処理時間がかかる可能性がある。 - 上と似てますが、TRUNCATEに比べて処理が遅いです。
- テーブル内のデータを全て削除する場合でも、
空のページがテーブルに残ることがあります。
TRUNCATEコマンド
概要
TRUNCATE
は、テーブル内の全行を高速に削除し、
テーブルを初期化するコマンドです。
WEHRE句による条件指定はできません。
TRUNCATE TABLE (テーブル名);
詳細
- テーブルから全ての行を削除しますが、
テーブル構造とインデックスは保持されます。 - トランザクションログを少なく消費し、
削除操作を高速に行うことができますが、
通常はロールバックできません(一部のDBMSでは可能)。
メリット
- 大量のデータを含むテーブルを迅速にクリアすることができます。
※DELETEに比べ圧倒的に早い! - テーブルをリセットするのに適しており、パフォーマンスが高いです。
- ハイウォーターマーク(HWM)をクリアします。
※割り当て領域のクリアはオプションで選択可能
デメリット
- 条件を指定して特定のデータのみを削除することはできません。
- 一部のDBMSを除き、
実行後に操作をロールバックすることはできません。
使い分け
- DELETE:
特定の条件に基づいてデータを削除したい場合や、
削除操作をロールバックする可能性がある場合に適しています。 - TRUNCATE:
テーブル内のデータをすべて高速に削除し、
テーブルを初期状態に戻したい場合に適しています。
ただし、削除操作を元に戻すことはできないため、使用には注意が必要です。
適切なコマンドの選択は、操作の目的とパフォーマンスの要件によって異なります。
データの安全性を確保しつつ、効率的にデータ管理を行うために、
これらの違いを理解し、適切に使い分けることが重要です。
参考:DROPコマンド
概要
削除という意味では
DROPコマンドもありますので、書いておきます!
完全に削除するのでロールバックができません。
テーブルも残りませんので、ご注意ください!
DROP TABLE (テーブル名);
このコマンドは、テーブル以外に、
ビュー、データベースなどにも使えます(完全に削除します。)
メリット
- テーブルやデータベースが完全に不要になった場合、
データを個別に消す操作を行う必要がなく、
シンプルかつ確実に全てを削除できる。 - 大量のデータが入っているテーブルを削除したい場合でも、
行ごとに削除するDELETE
よりも、DROP
は一気に処理が進むため、非常に高速。 - ディスクスペースが必要な場合、
DELETE
では行データが消えるだけで、テーブル構造は残ります。TRUNCATE
でもテーブルの定義は残りますが、DROP
を使うとスペースが完全に解放されます。
デメリット
- テーブル自体が完全に削除されるため、
インデックスや制約、参照関係も全て消えます。 - 一部のデータベースではトランザクションをサポートしないため、
DROP
操作は元に戻せない場合が多い(ロールバック不可能)。
まとめ
本記事では、
データ削除操作のDELETE
とTRUNCATE
と
おまけでDROPの3つのコマンドをご紹介しました。
これらのコマンドは表(テーブル)から
データを削除する点では共通していますが、
使用方法、パフォーマンス、副作用には大きな違いがあります。
以下、まとめです!
操作 | 対象 | 削除対象 | ロールバック | パフォーマンス | テーブル構造 |
---|---|---|---|---|---|
DELETE | テーブルの行 | 条件に合う行 | 可能 | 行ごとに削除するため遅い | 構造は維持 |
TRUNCATE | テーブル全体の行 | 全ての行 | 一部のDBでは不可 | 高速(全行削除) | 構造は維持 |
DROP | テーブルまたはデータベース | テーブル全体・データベース全体 | 不可 | 高速(構造ごと削除) | 構造ごと削除 |
DELETEとTRUNCATEのメリット・デメリットを考慮し、
使い分けていきましょう〜。
誰かの参考になれば幸いです!