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