« 続・東証システムトラブル | トップページ | 期待した人、ごめんなさいw »

2005.11.02

しこしこチューニング

いや本当に私は '||' を忘れてしまうくらいSQLがわかっていないというおバカちゃんなのであるが、運用系に携わって来た期間が長いんで、「とりあえず作ってみました」系のプログラム品質には泣かされる毎日。
まあ最近はパワーソリューションで問題解決、ってのが案外工数がかからなくて解決できてみんながハッピーということも多いけども、ソフトのちょっとしたチューニングで速くなるんならやっといてもいいんでないかい?と。。。。

今回の例:

 SELECT distinct A.a from A INNER JOIN B ON A.a = B.a
 WHERE date(today) - date(B.c) > 90 AND A.a='$l_strItem';
今日取り組んだのは上記のようなSQL。本当の条件はもっと複雑だが、例示のための簡略化。
ポイントはWHERE句の条件設定方法にある。
単品のSQLとしてはそれほど問題にならないと思うのだが、該当処理は数万件の品目マスタと数十万件の受注テーブルを連結している。上記のような処理を品目マスタの件数だけ実行するというのだから1回ごとの処理コストはチリも積もればでも最終的には馬鹿にならない。
で、今回の対応については日付型のデータについて減算演算をしているところが割りに合わない工数となっていると思われたので
 WHERE date(B.c) > '$l_date' ;
という感じでおしまい。
l_dateはこのループ処理を行う前に date(today)-90 で取得しておくこととした。
これによって、個々のSQL文のコストを約50%カット出来たため、プログラム全体で30%程度の処理速度改善となった。

本当はこの処理が本当に品目マスタの回数だけ行う必要があるのか、という抜本的な処理ロジックを疑うのも非常に重要なんだが(^^;
よほどコストの悪い処理でなければコストの小さい処理を数万回実行するより1回で実行した方がよいことも少なくないので、この辺は処理ごとにケースバイケース。個別に分けてプログラムでループさせれば2分で終わるのに、1回のSQLでやろうとしたらディスクスワップして1時間かかる、ということももちろんあるし。

ともあれこの辺は詳細設計書のレベルによるんだろうなあ。
おいらが書いているのは基本設計なんでSQL文そのものは書かないし。(だからSQL忘れるんだろ(^^;)

|

« 続・東証システムトラブル | トップページ | 期待した人、ごめんなさいw »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2022/6850880

この記事へのトラックバック一覧です: しこしこチューニング:

« 続・東証システムトラブル | トップページ | 期待した人、ごめんなさいw »