- ベストアンサー
無駄に見える結合の回数を減らす方法
- 無駄に見える結合の回数を削減する方法について教えてください。
- 現在、クライアント毎に宅配便の利用履歴を表示する機能を作成していますが、結合の多用により処理が非常に遅くなっています。
- 特に、サイズ1から8までの結合や仕入単価や請求単価の結合が重複している部分が無駄に見えます。より効率的な方法はないでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
strSelect &= " inner join (select * from クライアントマスタ union select * from 関連会社マスタ) as CM on TM.ClientNO = CM.ClientNO " これはunionしているから仕方ないですけど、 他のjoinの大半について。 strSelect &= " left outer join (select * from コードマスタ where 識別コード=00002) as CO2 on TM.内容NO = CO2.汎用コード" などはなんでleft outer join (select * from ・・・)なんですか? left outer join コードマスタ as CO2 on TM.内容NO = CO2.汎用コード and 識別コード=00002 としていないから副問い合わせをした結果と結合するので、 インデックスは使えないし、作業用にメモリかディスクは食っているし負荷とレスポンスの大敵と なっていますけど。 なお、 inner join (select * from クライアントマスタ union select * from 関連会社マスタ) as CM on TM.ClientNO = CM.ClientNO も、 inner join クライアントマスタ as CM1 on TM.ClientNO = CM1.ClientNO inner join 関連会社マスタ as CM2 on TM.ClientNO = CM2.ClientNO として、冒頭のSelect句の、 select CM.クライアント名 as クライアント, を select case when CM1.クライアント名 is not null then CM1.クライアント名 else CM2.クライアント名 end as クライアント, とし、末尾のwhere句に and (CM1.クライアント名 is not null or CM2.クライアント名 is not null) としたほうが、私が思っているデータ量なら、はやいと思います。 (select * from クライアントマスタ union select * from 関連会社マスタ が数十件程度しか取得しないのならこちらは無視してください。)
その他の回答 (1)
- nora1962
- ベストアンサー率60% (431/717)
正直、SQLが複雑すぎます。こちらで展開してみましたが投稿文字数の制限に引っかかってしまいました。 まず、( SELECT ~ WHERE ) とLEFT JOINの組み合わせが多すぎます。 これでは( SELECT ~ WHERE )で絞り込んだデータと元データとのネステッドループジョインが多発してしまいます。 本当にLEFT JOINの必要があるのでしょうか?また、そもそも、マスタにないデータの入力を許すようなシステムに問題はないでしょうか(参照整合性制約の利用も考えられます)。 この部分をINNER JOINのON条件にまとめることが出来れば、複合索引を作成しパフォーマンスが向上できると思います。 (select * from クライアントマスタ union select * from 関連会社マスタ)の部分も「union」を「union all」にはできないのでしょうか。
お礼
nora1962様、御礼が大変遅くなりました。 ご回答ありがとうございます。 left joinの必要性に関しては、各項目を出荷伝票取込時、出荷報告書取込時、請求書取込時の3段階に分けて取り込んでいるのですが、すべての項目が埋まる前に一覧を表示することが可能となるように用いています。 union allについては知識不足でした。 早速取り入れさせていただきました。 ありがようございました。
お礼
Siegrune様、お礼が大変遅くなりました。 ご指摘をいただいた後、改めて見返してみて自身のコードの酷さに頭を抱えてしまいました。 onの後にandを入れること自体に気づいていなかったならともかく、 一部のコードでは使っているという無茶苦茶な有様。 全体的に整理して、だいぶすっきりさせることができました。 本当にありがとうございました。 クライアントマスタと関連会社マスタに関しては50件程度なのでひとまず現状のままとし、 今後の取引先の増加に備えてSQL文をコメントで残しておきます。