溝の口。
依頼元の会社の若手が作ったプログラムで、性能問題が発生。
画面で検索ボタンを押すと、10 分ほど返ってこない。
さすがにまずいだろう。
ボクのテストは終わったので、その人の作った SQL を見てみる。
まず、FROM 句にある二つのテーブルが、結合されていない。
そこか。
それを直してもまだ遅い。
Oracle のヒント文を使って実行計画を設定してみる。
ちょっとはマシになった。
SQL*Plus では早いのに、JDBC 経由だと遅くなるみたい。
画面から検索すると、あいかわらず 10 分オーバーだ。
しかたがないのでトレースしてみると、全件走査になっている。
ヒントをいろいろ変えてもダメ。
う~ん。
調べてみると、どうやらバインド変数を使っていると、実行時に計画が変わることがあるらしい。
どうしよう。
SQL を見直していると、そもそも仕様通りに作られていないことを発見。
WHERE 句になぜか意味のない EXISTS がある。... WHERE EXISTS ( SELECT MAX(LOG_DATE) FROM DATA_TABLE ) ...
なにこれ。
本人に聞いてみると、どうやら最新の日付のデータを検索したいらしい。
EXISTS じゃ全部引っかかっちゃうよ。
... WHERE RESULT_TABLE.LOG_DATE = ( SELECT MAX(LOG_DATE) FROM DATA_TABLE ) ...
仕様を細かく聞いて、こう直した。
すると、どうも実行計画も変わったらしい。
画面から検索しても 1 秒もかからなくなったよ。
ふう~。
どっと疲れが。
性能問題は経験がない人が作ると顕著だよなぁ~。
夕飯はカレー。