ここでは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文の書き方:サンプル多数あり