- 締切済み
IN 句ではインデックスが使用されない?
環境はDB2で現在チューニング作業を担当しています。 ここでWHEREに COL1='AAA' AND COL2='BBB' AND COL3 IN ('CCC','DDD') とある時、COL1、COL2、COL3を含む複合列インデックスを作成したのですが インデックスが使われません。 ※テーブルスキャンになります 上司はIN句があるから仕方ない。。と言うのですがどうも腑に落ちません。 でも確かにIN句をコメントアウトしCOL1、COL2のみで検索すると インデックスを使います。うーんという感じです。 お手数ですがご意見お願いします。。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
オプティマイザ氏の所見を知りたいところですが(笑)それ以外で考えられることといえば、オプティマイザがINに関する最適化を苦手としているのかもしれません。 COL1='AAA' AND COL2='BBB' AND COL3='CCC' であればCOL1,COL2,COL3の複合インデクスが使われるわけですよね。 それを確認した上で、上のWHEREを COL1 IN ('AAA') AND COL2='BBB' AND COL3='CCC' とか COL1='AAA' AND COL2 IN ('BBB') AND COL3='CCC' とか COL1='AAA' AND COL2='BBB' AND COL3 IN ('CCC') とかに変更して、アクセスプランが同じになるのかどうか(ちゃんとインデクスが使われるかどうか)を確認してみてはいかがでしょうか。 もし、同じ意味のWHEREなのにINにするとアクセスプランが変わるようであれば、オプティマイザがINに関してうまく最適化できないのだということになります。 また、はじめの COL1='AAA' AND COL2='BBB' AND COL3 IN ('CCC','DDD') を COL1='AAA' AND COL2='BBB' AND (COL3='CCC' OR COL3='DDD') にすると、また違ったアクセスプランを取ろうとするかもしれません。これで望むインデクスを使ってくれるようであれば、ひとまずこれで逃げる手もあるでしょう。 あとは、オプティマイザが統計情報を一覧したところ、テーブルスキャンをしたほうが効率が良いと判断した・・・という可能性も、まぁ皆無とは言えません。 統計情報をどの程度尊重しているのかは分かりませんが、ひとまず統計情報をアップデートしてみるのも1つの選択肢でしょう。 参考: http://www.atmarkit.co.jp/fdb/rensai/rdbmsarc02/rdbmsarc02_2.html