1

わずか10,703レコードの非常に小さなテーブル「イベント」があります。次のクエリには約600 ミリ秒かかります。

SELECT count(id) 
FROM events 
WHERE event_date > now() 
    AND earth_distance((select position from zips where zip='94121'), ll_to_earth(venue_lat, venue_lon))<16090;

私はこのようにGISインデックスを設定しようとしました

 CREATE INDEX latlon_idx on events USING gist(ll_to_earth(venue_lat, venue_lon));

しかし、何も変わりませんでした。event_date にもインデックスがあります。分析の説明は次のとおりです。

Aggregate  (cost=5400.48..5400.49 rows=1 width=8) (actual time=615.479..615.479 rows=1 loops=1)    InitPlan 1 (returns $0)
     ->  Index Scan using zips_zip_idx on zips  (cost=0.00..8.27 rows=1 width=56) (actual time=0.051..0.056 rows=1 loops=1)
           Index Cond: ((zip)::text = '94121'::text)    ->  Bitmap Heap Scan on events  (cost=144.41..5386.03 rows=2468 width=8) (actual time=16.065..599.613 rows=3347 loops=1)
         Recheck Cond: (event_date > now())
         Filter: (sec_to_gc(cube_distance(($0)::cube, (ll_to_earth((venue_lat)::double precision, (venue_lon)::double precision))::cube)) < 16090::double precision)
         ->  Bitmap Index Scan on events_date_idx  (cost=0.00..143.79 rows=7405 width=0) (actual time=13.523..13.523 rows=7614 loops=1)
               Index Cond: (event_date > now())  Total runtime: 615.663 ms (10 rows)

スピードアップするために他に何ができますか?

4

0 に答える 0