[postgis-users] ST_DWITHIN indices

Ben Madin lists at remoteinformation.com.au
Thu May 5 18:39:54 PDT 2011


Sairam,

On 06/05/2011, at 5:50 AM, Sairam Krishnamurthy wrote:

> Table structure: lat AS double, lon AS double, spatialPoint AS point. 
> 
> I have a query that uses ST_DWITHIN. I was under the impression that this function will use the gist index on spatialPoint. 
> 
> Index query:
> CREATE INDEX "table_spatial_index" ON "table" USING btree ("spatialPoint");

St_DWithin does use a bounding box if there are suitable indexes. I'm only using 1.5, so things might be different if you are using 2.0 or < 1.3, but I think if you want to use a GIST index you need to create a GIST index, not a b-tree. I thought - and I stress I'm not an expert on indexes that b-tree was one-dimensional.

> Select query: 
> SELECT lat, lon FROM "table" WHERE ST_DWITHIN("table"."spatialPoint", ST_SetSRID(ST_MakePoint(0.064777,18.420500), 4326), 0.0011);


Also, I'd caution against using ST_DWithin and non-projected data systems. you won't actually be seeing a circle, even if you do appear to be close to the equator. 

cheers

Ben






> 
> Query plan:
> 
> EXPLAIN SELECT lat, lon FROM "EVI250m" WHERE ST_DWITHIN("EVI250m"."spatialPoint", ST_SetSRID(ST_MakePoint(0.064777,18.420500), 4326), 0.0011);
>                                                                                                                                                             
>  QUERY PLAN                                                                                                                                                 
>             
> -------------------------------------------------------------------------------------------------------------------------------------------------------------
> -------------------------------------------------------------------------------------------------------------------------------------------------------------
> ------------
>  Seq Scan on "EVI250m"  (cost=0.00..4757082.00 rows=1 width=16)
>    Filter: (("spatialPoint" && '0103000020E61000000100000005000000000000A0224DB03F000000C05D6B3240000000A0224DB03F00000020EE6B3240000000C050DDB03F00000020EE6
> ) AND _st_dwithin("spatialPoint", '0101000020E61000002A7288B83995B03FCFF753E3A56B3240'::geometry, 0.0011::double precision) AND ('0101000020E61000002A7288B83
> recision)))
> (2 rows)
> 
> 
> Any thoughts ?
> 
> 
> 
> Thanks,
> Sairam Krishnamurthy




More information about the postgis-users mailing list