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操作は元に戻せない場合が多い(ロールバック不可能)。
まとめ
本記事では、
データ削除操作のDELETEとTRUNCATEと
おまけでDROPの3つのコマンドをご紹介しました。
これらのコマンドは表(テーブル)から
データを削除する点では共通していますが、
使用方法、パフォーマンス、副作用には大きな違いがあります。
以下、まとめです!
操作
対象
削除対象
ロールバック
パフォーマンス
テーブル構造
DELETE
テーブルの行
条件に合う行
可能
行ごとに削除するため遅い
構造は維持
TRUNCATE
テーブル全体の行
全ての行
一部のDBでは不可
高速(全行削除)
構造は維持
DROP
テーブルまたはデータベース
テーブル全体・データベース全体
不可
高速(構造ごと削除)
構造ごと削除
DELETEとTRUNCATEのメリット・デメリットを考慮し、
使い分けていきましょう〜。
誰かの参考になれば幸いです!