【SQL】DELETE文が遅いときのチューニング方法

ここではORACLEデータベースのSQLでDELETE文が遅いときのチューニング方法を紹介しています。

SQLの実行計画の見方や確認方法については↓で紹介していますので参考にしてください。
>>【ORACLE】SQLの実行計画の見方
>>【ORACLE】SQLの実行計画を取得する方法

DELETE文が遅い原因とチューニング方法

DELETE文が遅い原因はいくつか考えられます。それぞれの原因ごとにチューニング方法を紹介します。

削除対象のレコードが多すぎる場合

基本的なことですが、DELETE文で削除の対象としているレコードが増えれば増えるほど、削除にかかる時間が増えてきます。

次のSQLのように、WHERE句の条件を全く付けない場合は、テーブルの全ての行を一括で削除することになります。この場合、テーブル件数が1,000万件なら、1,000万件を一括で削除することになります。

DELETE FROM tab1;

このような場合は、まずは必要なレコードだけ削除するようにWHERE句に条件を追加しましょう。

どうしても条件が付けられない場合には、パラレルSQLとして実行して高速化することもできます。

削除対象のレコードの抽出に時間がかかる場合

DELETE文で削除の対象とするレコードをWHERE句の条件で絞込するときに時間がかかっていることがあります。

次のDELETE文では、TAB1テーブルのCOL1列の値が100のレコードを抽出し、削除しています。

DELETE FROM tab1 WHERE col1 = '100';

上記のSQLで、WHERE句で指定した条件に合致するレコードを抽出するのに時間がかかっている場合は、索引(インデックス)を作成します。

インデックスはSELECT文だけでなく、DELETE文やUPDATE文のWHERE句でも有効でレコードの絞り込みを高速化してくれます。

CREATE INDEX tab1_idx0 ON test.tab1(col1) TABLESPACE index_tbs;

SQLのWHERE句の書き換えでチューニングできる

DELETE文は、インデックスの他にも、SELECT文と同様にSQLを書き換えるなど、チューニングを行うことが出来ます。

SQLの書き換えには「IN句をEXISTS句に置き換えするチューニング方法」や「OR句の置き換えによるチューニング方法」などがあります。

他にもSELECT文と同じ要領でチューニングすることもできます。詳しくは「SELECT文のSQLチューニング方法まとめ」で解説しているのでぜひ参考にしてください。

まとめ

DELETE文が遅い場合には、
 ・レコードを絞るための必要な条件をつける
 ・WHERE句での絞り込みに時間がかかる場合は、インデックスを作成する
 ・SELECT文と同様に、SQLの書き換えでチューニングをする
という対処方法があります。

この他、当サイトではUPDATE文の書き方について↓で紹介していますのでぜひ参考にしてください。
>>【SQL】DELETE文の書き方:サンプル多数あり