[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 メーリングリストの案内