アプリ版:「スタンプのみでお礼する」機能のリリースについて

環境はDB2で現在チューニング作業を担当しています。

ここでWHEREに

COL1='AAA'
AND
COL2='BBB'
AND
COL3 IN ('CCC','DDD')

とある時、COL1、COL2、COL3を含む複合列インデックスを作成したのですが
インデックスが使われません。
※テーブルスキャンになります

上司はIN句があるから仕方ない。。と言うのですがどうも腑に落ちません。
でも確かにIN句をコメントアウトしCOL1、COL2のみで検索すると
インデックスを使います。うーんという感じです。

お手数ですがご意見お願いします。。

A 回答 (1件)

オプティマイザ氏の所見を知りたいところですが(笑)それ以外で考えられることといえば、オプティマイザが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/ …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!