[postgis-users] No index usage on geography query plan?

Mark Cave-Ayland mark.cave-ayland at siriusit.co.uk
Wed May 26 05:25:38 PDT 2010


Nicholas Bower wrote:

> But simply swapping the query region above from geometry to geography 
> we're back to no index usage,
> 
> explain analyze select count(*) from wastac.t_tile_geometry_old where 
> ST_Intersects(border, 
> ST_GeographyFromText('SRID=4316;POLYGON((116.751709 
> -31.381779,116.883545 -32.676373,114.741211 -32.796510,114.796143 
> -31.316101,116.751709 -31.381779))'));
> 
>  Aggregate  (cost=362164.77..362164.78 rows=1 width=0) (actual 
> time=80302.237..80302.237 rows=1 loops=1)   ->  Seq Scan on 
> t_tile_geometry_old  (cost=0.00..361101.11 rows=425463 width=0) (actual 
> time=19680.252..80302.172 rows=95 loo
> ps=1)
>          Filter: st_intersects((border)::geography, 
> '0103000020DC1000000100000005000000F8C610001C305D40B24CBF44BC613FC0D6E253008
> C385D40DE72F563935640C0DF1B430070AF5C40EE77280AF46540C01EFCC401F4B25C409F3BC1FEEB503FC0F8C610001C305D40B24CBF44BC613FC0'::geogra
> phy)
>  Total runtime: 80302.285 ms

Right. So the give away in the above query is the cast in the 
st_intersects() filter; it looks as if your border column in 
wastac.t_tile_geometry_old is a *geometry* while your intersection 
geometry is a *geography*. Since PostgreSQL sees that you are trying to 
perform an operation on two different types, it cannot make use of the 
indexes on those two columns. Hence it performs a sequential scan across 
the whole table converting on the fly, which is going to take a lot more 
time.

Try making a copy of your wastac.t_tile_geometry_old table but with a 
geography instead of geometry column for border, and you should see an 
improvement.


HTH,

Mark.

-- 
Mark Cave-Ayland - Senior Technical Architect
PostgreSQL - PostGIS
Sirius Corporation plc - control through freedom
http://www.siriusit.co.uk
t: +44 870 608 0063

Sirius Labs: http://www.siriusit.co.uk/labs



More information about the postgis-users mailing list