web-dev-qa-db-ja.com

Postgres point()インデックスが使用されていません

\ d集計

              Materialized view "public.aggregate"
          Column      |            Type             | Modifiers 
    ------------------+-----------------------------+-----------
     id               | integer                     | 
     searchable       | text                        | 
     name             | character varying(255)      | 
     source_type      | character varying(255)      | 
     source_id        | integer                     | 
     latitude         | double precision            | 
     longitude        | double precision            | 
     created_at       | timestamp without time zone | 
     updated_at       | timestamp without time zone | 

Indexes:
    "aggregate_lat_lng_point" Gist (point(latitude, longitude))
    "searchable_tsvector" gin (to_tsvector('english'::regconfig, COALESCE(searchable, ''::text)))

クエリ:

EXPLAIN ANALYZE SELECT name FROM aggregate 
WHERE point(53.574753, -2.1) <@> point(latitude, longitude) < 100;

結果:

 Seq Scan on aggregate_mv  (cost=0.00..23.01 rows=172 width=516) (actual time=0.019..0.522 rows=458 loops=1)
   Filter: (('(53.574753,-2.1)'::point <@> point(latitude, longitude)) < 100::double precision)
   Rows Removed by Filter: 320
 Total runtime: 0.579 ms
(4 rows)

ご覧のとおり、インデックスは使用されていません。テーブルには525行が含まれ、上記のクエリは195行を返します。テーブルはマテリアライズドビューですが、それは何の違いもないはずです、私はうまく機能する他のインデックスを持っています。上記のクエリで私のインデックスが使用されていない理由に関するアイデアはありますか?

3
StuR

テーブルが小さいため、インデックスは使用されません。インデックスを使用するよりもスキャンする方がおそらく高速です。

確認するには、(テストのみ)SET enable_seqscan = offを設定します。

ここでインデックスを使用するほうが実際に高速である場合は、おそらくrandom_page_costを下げる必要があります。

Update<@>がGistでサポートされている演算子にリストされていないようです 、したがって、適切なopclassを追加する拡張機能は、おそらく運が悪いでしょう。

1
Craig Ringer

インデックス作成を利用するために、キューブベースを使用するように切り替えました。

CREATE INDEX aggregate_cube ON aggregate USING Gist (ll_to_earth(latitude, longitude));

explain analyze select name from aggregate where earth_box(ll_to_earth(53.574753, -2.1), 100 * 1609.344) @> ll_to_earth(latitude, longitude);

 Bitmap Heap Scan on aggregate  (cost=9.06..259.53 rows=69 width=516) (actual time=0.218..0.476 rows=134 loops=1)
   Recheck Cond: ('(3779643.6387679, -143776.582140441, 5127079.5615671),(3789643.63851185, -133776.582396498, 5137079.56131104)'::cube @> (ll_to_earth(latitude, longitude))::cube)
   ->  Bitmap Index Scan on aggregate_cube  (cost=0.00..9.05 rows=69 width=0) (actual time=0.190..0.190 rows=134 loops=1)
         Index Cond: ('(3779643.6387679, -143776.582140441, 5127079.5615671),(3789643.63851185, -133776.582396498, 5137079.56131104)'::cube @> (ll_to_earth(latitude, longitude))::cube)
 Total runtime: 0.516 ms
(5 rows)
6
StuR