- ベストアンサー
where条件内のin句について
質問です。 where code in(select code from list where ....) ------------------------------------------ といったwhere句がある場合ですが、 in句でヒットしている件数が5000件を超えているため SQLを発行してもタイムアウトでエラーになります。 何か回避策はないでしょうか? よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
1です そうですか。通常サブクエリでのヒット件数が多い場合にはかなり有効な手法なのですが、合わなかったようですね。 単純にサブクエリが重いということはありませんか? 前者にしろ後者にしろ、サブクエリ内が全件走査を行うようではパフォーマンスの向上は見込めません。 サブクエリで得られるCODEの種類が多く、かつ1の例で CODEに適切なインデックスが張ってある場合は、劇的なパフォーマンスの向上が見込まれます。 ご参考までに。
その他の回答 (1)
- yamahanian
- ベストアンサー率46% (7/15)
こういった場合は相関副問合せという手法を使用します。 panchopancho1さんが行っているコードはおそらく SELECT * FROM MAINLIST WHERE CODE IN (SELECT CODE FROM LIST WHERE...) のようになっていますよね? これを SELECT * FROM MAINLIST A WHERE EXISTS (SELECT * FROM LIST WHERE CODE = A.CODE) という風にしてあげます。 親SQLのテーブルに別名をつけてあげ、 その親テーブルのデータをもとに子を検索します。 こんなかんじでいかがでしょうか。
お礼
早速の返信ありがとうございます。 試してみたのですが、何分IN句でヒットしている 件数が多いせいか、劇的にパフォーマンスが向上 するというわけにはいきませんでした。 それと、EXISTSでレコードを大量に絞り込めれば 良いのですが、そういったテーブルの関係になっていない ケースでした。 しかーし、返信いただき、ありがとうございました。
お礼
結果報告です。 ・サブクエリ内のある項目にインデックスを作成し、最優 先のインデックスにした。 ・サブクエリ内で使用していた(concatによる)文字連結 をやめた。 以上2対策とで何とかレスポンスを10秒以内で収めることが出来ました。 まだ、良いパフォーマンスとはいえないですが、対象テーブルの件数から見てもこれなら納得してもらえそうな感じです。 やはり、yamahanianさんの言われていたとおり、サブクエリが重い処理になっていたようです。 サブクエリのみで実行するとすぐに結果が返ってくるので、見落としておりました。 ありがとうございました。