|
|
SELECT count(*) FROM accounts WHERE aid IN (1,2,3);
QUERY PLAN
---------------------------------------------------------------------------
Aggregate (cost=17.68..17.69 rows=1 width=0)
-> Bitmap Heap Scan on accounts (cost=6.01..17.67 rows=3 width=0)
Recheck Cond: ((aid = 1) OR (aid = 2) OR (aid = 3))
-> BitmapOr (cost=6.01..6.01 rows=3 width=0)
-> Bitmap Index Scan on accounts_pkey (cost=0.00..2.00 rows=1 width=0)
Index Cond: (aid = 1)
-> Bitmap Index Scan on accounts_pkey (cost=0.00..2.00 rows=1 width=0)
Index Cond: (aid = 2)
-> Bitmap Index Scan on accounts_pkey (cost=0.00..2.00 rows=1 width=0)
Index Cond: (aid = 3)
(10 rows)
|
それに対して,8.2では以下のようなプランになる。
QUERY PLAN
---------------------------------------------------------------------------
Aggregate (cost=23.68..23.69 rows=1 width=0)
-> Bitmap Heap Scan on accounts (cost=12.02..23.67 rows=3 width=0)
Recheck Cond: (aid = ANY ('{1,2,3}'::integer[]))
-> Bitmap Index Scan on accounts_pkey (cost=0.00..12.02 rows=3 width=0)
Index Cond: (aid = ANY ('{1,2,3}'::integer[]))
(5 rows)
|
IN項目でいったん配列を作り,インデックスへのアクセスを一度で済ませているために,効率がよい。
この改良でどの程度性能が向上したのかを検証するためにベンチマークテストを行ってみた。