[postgis-users] within_distance function

Paul Ramsey pramsey at refractions.net
Fri Feb 9 15:48:47 PST 2007


Perhaps doing the function as a SQL function rather than a PL/PgSQL 
function. Shot in the dark.

P

Obe, Regina wrote:
> On further inspection, I realized my within_distance is not using the
> gist index and that the gain over the just distance check was because
> of the efficiency of extent comparison instead of distance
> comparison.
> 
> I suppose there is no way to trick the optimizer into using an index
> with the function call.  Something like a macro of some sort so it
> macro replaces my shorter statement with the more efficient longer
> statement?
> 
> ________________________________
> 
> From: postgis-users-bounces at postgis.refractions.net on behalf of Obe,
> Regina Sent: Fri 2/9/2007 3:32 PM To: PostGIS Users Discussion 
> Subject: [postgis-users] within_distance function
> 
> 
> I was hoping to simplify some of my distance queries by creating a
> within_distance function which looks like
> 
> CREATE OR REPLACE FUNCTION within_distance(geom1 geometry, geom2
> geometry, dist double precision) RETURNS boolean AS $BODY$ BEGIN 
> return  (expand(geom1, dist) && geom2 AND distance(geom1, geom2) <=
> dist) ; END;$BODY$ LANGUAGE 'plpgsql' IMMUTABLE;
> 
> Upon testing this I noticed the following observations
> 
> SELECT l.pid, l.the_geom FROM landparcels l , landparcels l2 WHERE
> l2.pid = '1803570000' and within_distance(l.the_geom, l2.the_geom,
> 1000) ;
> 
> runs in 1610ms and returns 679 rows 
> ---------------------------------------------------------------------------
>  SELECT l.pid, l.the_geom FROM landparcels l, landparcels l2 WHERE
> l2.pid = '1803570000' and (expand(l.the_geom, 1000) && l2.the_geom
> AND distance(l.the_geom, l2.the_geom) <= 1000)
> 
> runs in 609 ms and returns 679 rows
> 
> --------------------------------------------------------------------------
>  SELECT l.pid, l.the_geom FROM landparcels l, landparcels l2 WHERE
> l2.pid = '1803570000' and (distance(l.the_geom, l2.the_geom) <= 1000)
> 
> 
> runs in 5437 ms and returns 679 rows
> 
> ----- I ran the test a couple of times with similar results.  So
> apparently as far as I can tell, my function is probably using my
> gist indexes, but why is it 1/2 the speed of the regular expand call?
> 
> 
> 
> 
> ________________________________
> 
> 
> 
> The substance of this message, including any attachments, may be 
> confidential, legally privileged and/or exempt from disclosure 
> pursuant to Massachusetts law. It is intended solely for the 
> addressee. If you received this in error, please contact the sender 
> and delete the material from any computer.
> 
> 
> 
> 
> ------------------------------------------------------------------------
> 
> 
> _______________________________________________ postgis-users mailing
> list postgis-users at postgis.refractions.net 
> http://postgis.refractions.net/mailman/listinfo/postgis-users


-- 

   Paul Ramsey
   Refractions Research
   http://www.refractions.net
   pramsey at refractions.net
   Phone: 250-383-3022
   Cell: 250-885-0632



More information about the postgis-users mailing list