OracleのIN句は、ORを使用するより、早く検索ができる。
しかし、このIN句に指定する値を何百件も指定すると、とんでもない
ことになり、大変な目にあう。
IN句は、最大1,000件まで、指定できるが、指定してはいけない。
理由は、このSQLが投げられた時、OracleがSQLを解釈するために
使用するメモリが、約100Mバッファーで使用していた(IN句指定600)。
このメモリは、SQL解釈後、すぐに開放され一時的ではあるが、
運用ピーク中注意しなくてはならない。
実際、このようなSQLがピーク中発行されるとタイミングによって、
OSからメモリを取得できず、ORA-04030発生する場合がある。
回避方法は、まず、SQLのチューニングが一番の解決策である。
IN句に、指定する値が、たくさんある場合、
別途Workテーブルを用意し、そのテーブルに一時的にデータをつっこみ、
そのテーブルと結合し、検索するやり方が、スマートである。
速度も問題ない。
IN句は、100件以下におさえたほうがよさそうである。
(個人的には、10件程度がよさそうである)
IN句に 600件指定 ⇒ 約100M増加(1SQL)
IN句に1,000件指定 ⇒ 約150M増加(1SQL)