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

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

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

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

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

更新対象のレコードが多すぎる場合

基本的なことですが、更新対象となるレコードが増えれば増えるほど、更新にかかる時間が増えてきます。

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

UPDATE tab1 SET flg = 1; 

このような場合は、まずは必要なレコードだけ更新するようにWHERE句に条件を追加しましょう。どうしても条件が付けられない場合には、パラレルSQLとして実行して高速化することもできます。

プログラムのミスやコーディングミスによって、上記のようなSQLが実際に実行されていることもあります。よく確認してみましょう。

レコードの絞り込みに時間がかかる場合

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

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

update tab1 set col2 = '500' where col1 = '100';

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

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

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

SQLの書き換えなど他にもチューニングできる

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

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

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

まとめ

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

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