[postgis-users] problems optimising PostGIS queries

Bill Binko bill at binko.net
Fri Jul 22 05:32:06 PDT 2005


On Fri, 22 Jul 2005, Gavin Fleming wrote:
>  
> SET enable_seqscan TO off;
> explain SELECT t.gid,t.objectid,t.id,t.sub_cat,t.lat,t.longx,f.fid,astext(f.the_geom) FROM towers t,fire f
> WHERE (f.tick > '2005-07-18') AND (expand(f.the_geom,.01) && expand(t.the_geom,.01));
> SET enable_seqscan TO on;
> 

The reason you're not using the GiST index(es) is that you don't have 
indexes defined for the term "expand(f.the_geom, .01)" or 
"expand(t.the_geom,.01)".  

In an ideal world, if the the value you're giving to expand (.01) 
is always a constant, you could solve this by adding a functional index:

CREATE INDEX expanded_t_gist ON towers GIST (expand(the_geom, .01))
CREATE INDEX expanded_f_gist ON fires GIST (expand(the_geom, .01))

Then, your SQL above would use the indexes.


> NOTICE:  LWGEOM_gist_joinsel called with arguments that are not column references

This makes me think that yours is not an ideal world, and that strk or 
others will tell me this won't work.  

If you have a need to change that constant on each request, you really do 
need to calculate a new bounding box for each shape you're comparing.  
However, since you're working with bounding boxes, you can probably get 
away with adding the entire buffer to one side:

SELECT ... WHERE t.the_geom && expand(f.the_geom, .02)

That should use t's GiST index regardless of whether you have a functional 
index defined.  You should also add it to the side with fewer items 
(hopefully fires! :)

Hope this helps.
Bill



More information about the postgis-users mailing list