ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3748004 SQLのIN句について
質問者:yumi_ DB:Oracle9i
SQLのIN句のカッコ内は、何個まで書けるなど、制限はあるのでしょうか?
PRO_KEY = IN (no1, no2, no3・・・)など、カッコ内が可変で、数百個、もしくは数千個ある場合、IN句を使用しデータを一度に取得するのではなく、PRO_KEY = no1のSELECT処理を発行、PRO_KEY = no2のSELECT処理を発行・・・し、ARRAYに検索結果を1つずつ詰めていく方が良いのでしょうか?

初心者で恐縮ですが、どなたかご教授ください。
困り度:
  • すぐに回答を!
質問投稿日時:
08/02/05 21:16
この質問に対する回答は締め切られました。

回答

ANo.3 1000個以上のデータをin句に入れるよりは、いったん一時テーブルに格納して、副問い合わせにしたほうがいいのでは。
回答者:nora1962
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:
08/02/08 16:36
この回答へのお礼ありがとうございました。

回答良回答20pt

ANo.2 INの指定は1000個までなので、
”IN(1000個) OR IN(1000個)”
などと、1000個づつORで区切ると良いです。
パフォーマンス的には、1件づつSELECTは圧倒的に遅くなります。
なぜなら、テーブル(もしくはインデックス)をSELECTのたびに検索するからです。
IN指定方式ならば、テーブル(もしくはインデックス)をなめるのは一回で済みます。件数が多いほど、顕著に差が出そうですね。

また、SELECTを何のプログラムから発行しているかにもよりますが、1回1回のSQL発行によるオーバヘッド(通信・wait時間)なども、回数が多くなると蓄積して大きなものとなるので、SQL発行回数自体も多くなりすぎないよう配慮が必要となります。

可能ならば、一度両方バージョン作ってみて時間を比較されると勉強になって良いと思いますよ。トレースも取ってみてみると良いと思いますわ。
回答者:uresiiwa
種類:回答
どんな人:専門家
自信:自信あり
回答日時:
08/02/06 07:44
この回答へのお礼ありがとうございました。

回答良回答10pt

ANo.1 こんばんは。

IN句の中に入れることのできる要素数の限界は1000個です。以前、この制限に引っかかったことがあって、1000個ずつ取ったことがありました。
SELECT文を大量に投げるのはちょっと負担になるような。

それ以前にIN句はあまり使いたくないですよね。
回答者:hakugen
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:
08/02/05 21:59
この回答への補足ご回答ありがとうございます!
ORの方が良いのでしょうか?
要素数が可変の場合は、普通はどうするのでしょうか?
ORを使用して、ORの条件文が数百?数千?になるのと、SQLを一回一回発行するのとでは、どちらが良いのでしょうか?
この回答へのお礼この回答にお礼をつける(質問者のみ)