- ベストアンサー
SQLのIN句について
DB:Oracle9i SQLのIN句のカッコ内は、何個まで書けるなど、制限はあるのでしょうか? PRO_KEY = IN (no1, no2, no3・・・)など、カッコ内が可変で、数百個、もしくは数千個ある場合、IN句を使用しデータを一度に取得するのではなく、PRO_KEY = no1のSELECT処理を発行、PRO_KEY = no2のSELECT処理を発行・・・し、ARRAYに検索結果を1つずつ詰めていく方が良いのでしょうか? 初心者で恐縮ですが、どなたかご教授ください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
INの指定は1000個までなので、 ”IN(1000個) OR IN(1000個)” などと、1000個づつORで区切ると良いです。 パフォーマンス的には、1件づつSELECTは圧倒的に遅くなります。 なぜなら、テーブル(もしくはインデックス)をSELECTのたびに検索するからです。 IN指定方式ならば、テーブル(もしくはインデックス)をなめるのは一回で済みます。件数が多いほど、顕著に差が出そうですね。 また、SELECTを何のプログラムから発行しているかにもよりますが、1回1回のSQL発行によるオーバヘッド(通信・wait時間)なども、回数が多くなると蓄積して大きなものとなるので、SQL発行回数自体も多くなりすぎないよう配慮が必要となります。 可能ならば、一度両方バージョン作ってみて時間を比較されると勉強になって良いと思いますよ。トレースも取ってみてみると良いと思いますわ。
その他の回答 (2)
- nora1962
- ベストアンサー率60% (431/717)
1000個以上のデータをin句に入れるよりは、いったん一時テーブルに格納して、副問い合わせにしたほうがいいのでは。
お礼
ありがとうございました。
- hakugen
- ベストアンサー率36% (8/22)
こんばんは。 IN句の中に入れることのできる要素数の限界は1000個です。以前、この制限に引っかかったことがあって、1000個ずつ取ったことがありました。 SELECT文を大量に投げるのはちょっと負担になるような。 それ以前にIN句はあまり使いたくないですよね。
補足
ご回答ありがとうございます! ORの方が良いのでしょうか? 要素数が可変の場合は、普通はどうするのでしょうか? ORを使用して、ORの条件文が数百?数千?になるのと、SQLを一回一回発行するのとでは、どちらが良いのでしょうか?
お礼
ありがとうございました。