プロが教える店舗&オフィスのセキュリティ対策術

質問です。

where
code in(select code from list where ....)
------------------------------------------
といったwhere句がある場合ですが、
in句でヒットしている件数が5000件を超えているため
SQLを発行してもタイムアウトでエラーになります。
何か回避策はないでしょうか?
よろしくお願いします。

A 回答 (2件)

1です


そうですか。通常サブクエリでのヒット件数が多い場合にはかなり有効な手法なのですが、合わなかったようですね。

単純にサブクエリが重いということはありませんか?
前者にしろ後者にしろ、サブクエリ内が全件走査を行うようではパフォーマンスの向上は見込めません。

サブクエリで得られるCODEの種類が多く、かつ1の例で
CODEに適切なインデックスが張ってある場合は、劇的なパフォーマンスの向上が見込まれます。

ご参考までに。
    • good
    • 0
この回答へのお礼

結果報告です。
・サブクエリ内のある項目にインデックスを作成し、最優 先のインデックスにした。
・サブクエリ内で使用していた(concatによる)文字連結
 をやめた。

以上2対策とで何とかレスポンスを10秒以内で収めることが出来ました。
まだ、良いパフォーマンスとはいえないですが、対象テーブルの件数から見てもこれなら納得してもらえそうな感じです。
やはり、yamahanianさんの言われていたとおり、サブクエリが重い処理になっていたようです。
サブクエリのみで実行するとすぐに結果が返ってくるので、見落としておりました。
ありがとうございました。

お礼日時:2003/09/18 17:41

こういった場合は相関副問合せという手法を使用します。



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のテーブルに別名をつけてあげ、
その親テーブルのデータをもとに子を検索します。

こんなかんじでいかがでしょうか。
    • good
    • 0
この回答へのお礼

早速の返信ありがとうございます。

試してみたのですが、何分IN句でヒットしている
件数が多いせいか、劇的にパフォーマンスが向上
するというわけにはいきませんでした。
それと、EXISTSでレコードを大量に絞り込めれば
良いのですが、そういったテーブルの関係になっていない
ケースでした。

しかーし、返信いただき、ありがとうございました。

お礼日時:2003/09/17 20:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!