象と戯れ

2008-05-09

Bitmap Scanの威力

17:22 | Bitmap Scanの威力 - 象と戯れ を含むブックマーク はてなブックマーク - Bitmap Scanの威力 - 象と戯れ

このへん見てて思った。

no title

select * from a where i in (select i from b);

select * from a where i = any (array(select i from b));

に変えるだけで場合によってはとってもスピードアップする。

a.iにインデックスが張ってある場合だけどね。

何が起こるかというと、a.iに対してBitmapScanが使われるようになる。

昔は

where i = any(array[1,2,3])

なんて遅いと思ってたけど、BitmapScanのおかげでかなりスピードアップしてるんだね。

自分の実例でいうと、

select * from i where (i = 1) or (i = 10) or (i = 50)

みたいなSQLで、(i = ?)が10ぐらいつながるとき、

select * from i where i in (1, 10, 50)

の方がBitmapScanが使われて早いことがある(BitmapORの方が遅い)。

Hackしなくても最初の例でBitmapScanが使われるようになるともっと幸せですね。