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