
DELETE文
1 |
DELETE テーブル名 where カラム名 = "条件"; |
- 標準SQLで定義されており、汎用性が高いです。
- DML(データ操作言語)の一種であり、自動でCOMMITはされることはないのでコミットしていなければロールバックが可能です。
- DELETE権限が必要になります。(TRUNCATEとは必要な権限が異なります。)
- DMLの中でも、パフォーマンスはかなり悪い処理です。
- WHERE句で削除対象のレコードを選択することができます。
- オートインクリメントは削除されないので仮に全行削除したとしても1から採番はしないです。
- ハイウォーターマーク(HWM)をクリアしません。
TRUNCATE文
1 |
TRUNCATE TABLE テーブル名; |
標準SQLにはないですが、メジャーなRDBMSではたいてい実装されています。(Orale、SQL Server、PostgreSQL、MySQL、DB2等)
ただ、RDBMSによって微妙に仕様が異なったりするので注意です。DELETE文に比べると、非常に処理速度が速いです。一部の行だけ削除するというような細かい制御をすることはできません。
- DDL(データ定義言語)の一種。DDLなので実行にはDROP TABLEと同じようにDROP権限が必要になります。(DELETEとは必要な権限が異なります。)
- オートインクリメントも削除されるので、次にデータを挿入する際は1から採番されるようになります。
- 自動COMMIT(即反映)になるのでロールバックができないので注意です。(PostgreSQLだけはロールバックできるケースもあるようです。)
- ハイウォーターマーク(HWM)をクリアするオプションが存在します。
なぜTRUNCATE文は速いのか?
DELETE文レコードの記録を保持する仕組みがありそれを使ってロールバックに活用する仕様になっていますが、TRUNCATE文は記録を保持する余計な処理がないためです。
全件削除する時間はどれくらいの差になるのか?
レコード件数やRDBMSやお使いのサーバースペックによっても違うのですが、例えば100万件レコードがあるテーブルであれば、DELETE文は10分程度も時間がかかったりしますが、TRUNCATE文であればなんと1秒もかからずに削除することが可能です。それくらいロールバックするための情報の記録にはコストがかかるということですね。
この記事へのコメントはありません。