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つの副作用もあります。

