お疲れ様です!!
ごぶさたしておりました。
その節はいろいろとお世話になりました。
先日、ORACLEを使用したシステムのテストを行っていたところ
データ量の増加に伴い、処理実行時間が異常に遅くなる処理が、
出てきました。
遅くなっているSQLは以下のようなものです。
※あるデータ内で別の区分で同じコードが存在するかのチェック
select * from DENPYOTBL A
where A.KUBUN = '10'
and exists (
select * from DENPYOTBL B
where A.corpcd = B.corpcd
and substr(B.KUBUN,1,1) = '2'
and A.key = b.key)
実行計画で確認しても、COSTも高くなく、結合しているのは
「主キー」。
なぜ?なぜ??なぜ???
おっと、、、ORACLEさんの罠に嵌るところでした!
実はここの「KUBUN」部分ですが「SUBSTR」などを使用した場合
INDEXを使用せず、全件検索にいってしまうのです。
よって、この場合の修正としては「in」を使って、該当の区分を
全種類書く方がいいのです。
select * from DENPYOTBL A
where A.KUBUN = '10'
and exists (
select * from DENPYOTBL B
where A.corpcd = B.corpcd
and B.KUBUN in ('20','21','22')
and A.key = b.key)
(あくまで一例です。もっと良い書き方があったら教えて~!)
これによって、150万件のデータで6時間かかっても終わらなかった
処理が、わずか3分で終わるようになりました。
プログラム単体テストでは、見落としがちなこういったSQLマジック。
みなさまも気をつけてください!!
それでは!!
あらゆるお困りごとを解決するために今日もWO助け隊は行く!
弊社アイビーソフトでは、現在プログラマーを募集しております。
システム開発をする中で、いろいろな経験をしながら楽しみたい方、
自由な発想で、自社パッケージソフトを企画、作成に携わりたい方。
やる気と行動力と素直な心があれば、
経験値なんてすぐに上げることができます。
挑戦する。
そんな気持ちで、一緒に働きましょう!!
応募詳細はこちら
小さい会社ですが、いいところもたくさんあります。
それを、入社して見つけてください。
あなたの力でもっともっと楽しい場所にしてほしい!