[pgsql-jp: 38809] Re: 3種類の値を持つ6つの項目の検索方法(ほぼ解決)
河本陽一
komoto.yoichi @ kcc.co.jp
2007年 9月 21日 (金) 16:16:22 JST
こうもとです。
> > このOKパターンマスタを事前に用意しておけば、内部結合して検索
> > できて、なんて考えてましたが、すみません。
> 良いアイデアかもしれません。
> 取得条件に2がくる可能性は低い(1.5%程度)ので、1と3のみの完全一致す
> るパターンを専用テーブルに用意しておけば、よさそうです。
良いアイデアかと思いましたが、かなり遅くなってしまいました。
比較用のテーブルから条件を抽出した後、ソートして本テーブルから検索
しているようです。
一致する条件が多い(1653件)ので速度が出ないと思われたので、項目を6
個から18個に増やしました。
すると、すごく速いです!(10万件からの検索で5ミリ秒)
一致する条件がとても少ない(2件)のが良かったのだと思います。
[pgsql-jp: 38778]の方法を読み直すと、完全一致するパターンを前もっ
て用意しておくというのは良く似ていて、2が含まれていた場合の処理が違っ
ていました。
[pgsql-jp: 38778]は、想定外に2が多い場合(numof2が想定以上)に極端に
性能が落ちそうなので、今回の検索用テーブルを使う方法にします。
2の数が想定内の場合は、副問い合わせがない分[pgsql-jp: 38778]のほう
が速そうですが、副問い合わせがあっても十分性能が出ているということも
あり、検索用テーブルを使う案になりました。
●検索
img=# EXPLAIN ANALYZE SELECT imgno,data FROM img WHERE imgno IN (SELECT imgno FROM imgidx WHERE data = '333333111131311131');
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------
Nested Loop (cost=733.93..739.97 rows=1 width=36) (actual time=0.929..1.372 rows=2 loops=1)
-> HashAggregate (cost=733.93..733.94 rows=1 width=4) (actual time=0.749..0.821 rows=2 loops=1)
-> Bitmap Heap Scan on imgidx (cost=6.64..732.76 rows=467 width=4) (actual time=0.522..0.598 rows=2 loops=1)
Recheck Cond: (data = '333333111131311131'::text)
-> Bitmap Index Scan on imgidx_data_idx (cost=0.00..6.64 rows=467 width=0) (actual time=0.441..0.441 rows=2 loops=1)
Index Cond: (data = '333333111131311131'::text)
-> Index Scan using img_pkey on img (cost=0.00..6.01 rows=1 width=36) (actual time=0.058..0.093 rows=1 loops=2)
Index Cond: (img.imgno = "outer".imgno)
Total runtime: 4.613 ms
(9 rows)
======================================================================
河本陽一(こうもとよういち)
mailto:komoto.yoichi @ kcc.co.jp
pgsql-jp メーリングリストの案内