insert
文とは違って、delete
文にはwhere
句があるため、第2章2, 「where句」で説明して来た全ての手法が使え、
インデックスの恩恵に直接あずかる事ができます。実際に、delete
文は、一致した行を削除するという追加のステップが必要なselect
とも言うべき動作をします。
実際の行の削除は、新しい行の挿入と似たプロセスです。特に、インデックスから参照を削除し、インデックスツリーのバランスを保つ動きが
似ています。図8.2の
パフォーマンスのグラフも、insert
の時のグラフと非常によく似ています。
図8.2インデックスの数による削除のパフォーマンス変化
理論的には、insert
と同じく
インデックスがテーブルにない場合にdelete
の
パフォーマンスは最高になります。しかし、インデックスがないと、データベースは削除すべき行を見つけるのにフルテーブルスキャンを
実行しなくてはなりません。つまり、行の削除自体は高速ですが、削除すべき行を見つけるのは非常に遅いという状況になってしまいます。
このようなケースは、図8.2には現われていません。
ただし、select
文が大量の行を返す場合には
インデックスがなくてもよいように、大量の行に対してdelete
を
実行する時には、インデックスがなくてもよいでしょう。
ヒント
delete
文と
update
文には、実行計画があります。
where
句のないdelete
文は、インデックスを使えない分かりやすい例でしょう。ただし通常は、
代わりに専用のSQLコマンドであるtruncate table
を
使用するでしょう。このコマンドは、一度に全行を削除する点を除いてwhere
句のないdelete
文と同じ効果があります。これは非常に高速ですが、(1) 暗黙的にcommit
が実行される、(2) トリガが実行されない、という2つの副作用もあります。