売上取り消し処理が遅いということで調査していたのですが、構文をみても単純である為、なかなか気がつきませんでした。
結局遅い原因として、副問い合わせ(EXISTS)を使った更新
(UPDATE)において、EXISTSの中に結合条件以外に外側の条件を含めていたため、処理に時間がかかっていたようです。
これにより、別の処理含めても1分→5秒になりました。作成時は件数が少なかったので気が付かなかったのかも知れませんが、反省を含めて掲載しておきます。
ちなみに私が作成したわけではないですが、すぐに気が付かなかったという点では知識不足だったわけです。
UPDATE T_JUCHU_H JH
SET
KANRYO_KBN = '0' -- 完了区分 0:未完了 1:完了
WHERE
EXISTS (
SELECT 1
FROM T_URIAGE_M UM
WHERE UM.JUCHU_NO = JH.JUCHU_NO
AND UM.JOTAI_KBN = '0'
-- AND JH.JOTAI_KBN = '0'; ← EXISTS の中にあると遅い
)
AND JH.JOTAI_KBN = '0'; ← EXISTS の外にすることで速くなった
一応Oracleですが、他のDBでも同じだと思うので気をつけましょう。
追記: 情報が不足してました。
インデックスは、JH.JUCHU_NOのみ、UM.JUCHU_NO と JOTAI_KBN はありません。
実行計画
consistent gets:SELECT(FOR UPDATE句有り)文 実行時のデータ要求
これ以外の項目はほぼ同じ値
EXISTS内: consistent gets 11657696
EXISTS外: consistent gets 1070