OracleのIN句使用の注意!!

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)

カテゴリー: ソフト   パーマリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>