[postgis-users] optimize: count up points near a point

Michael Fuhr mike at fuhr.org
Thu Jul 13 18:27:17 PDT 2006

On Thu, Jul 13, 2006 at 06:07:36PM -0700, Josh Livni wrote:
> I have about a million parcels, some of which are missing an attribute. 
>  I'd like to query parcels nearby (say within 1km) to get some stats on 
> their value for the attribute.
> Right now it takes about 40-60 seconds to report on the nearby parcels - 
> since over 100k parcels are missing the attribute, this is a problem...
> SELECT count(*) as count,
>   avg(asr_impr) as avg,
>   sum(asr_impr) as sum,
>   max(asr_impr) as max,
>   min(asr_impr) as min
> FROM parcels as p
> WHERE attribute > 0 and other_attribute = 11
>  AND (expand(p.the_geom,3280.8) && setsrid('POINT(6296272.3 
> 1955364.5)'::geometry,102646))
>  AND distance(centroid(p.the_geom), setsrid('POINT(6296272.3 
> 1955364.5)'::geometry,102646)) < 3280.8
> ---END QUERY---
> I have a btree index on the attribute and other_attribute columns, and a 
> gist index on the parcels centroid(the_geom) column.

What does EXPLAIN ANALYZE show for this query?  I don't think an
index on centroid(the_geom) is going to be used, but an index on
expand(the_geom, 3280.8) should be if you have one.  You might also
be able to speed up queries by creating another geometry column to
hold the centroid, which you could populate automatically via a
trigger (at the cost of slowing down inserts and updates).

Michael Fuhr

More information about the postgis-users mailing list