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

Mark Cave-Ayland mark.cave-ayland at siriusit.co.uk
Tue May 25 07:08:58 PDT 2010


Nicholas Bower wrote:

> Perhaps this makes it more obvious - 9s to query a table of just 1.3M 
> rows with ST_Intersects and 20ms using &&.
> 
> explain analyze select count(*) from wastac.t_tile_geometry where 
> ST_Intersects(border, 
> ST_GeographyFromText('SRID=4326;POLYGON((116.751709 
> -31.381779,116.883545 -32.676373,114.741211 -32.796510,114.796143 
> -31.316101,116.751709 -31.381779))'));
>  
>  Aggregate  (cost=364056.80..364056.81 rows=1 width=0) (actual 
> time=9175.760..9175.761 rows=1 loops=1)
>    ->  Seq Scan on t_tile_geometry  (cost=0.00..362993.14 rows=425463 
> width=0) (actual time=2164.049..9175.706 rows=95 loops=1)
>          Filter: st_intersects(border, 
> '0103000020E61000000100000005000000F8C610001C305D40B24CBF44BC613FC0D6E253008C385D40DE72F563935640C0DF1B430070AF5C40EE77280A
> F46540C01EFCC401F4B25C409F3BC1FEEB503FC0F8C610001C305D40B24CBF44BC613FC0'::geography)
>  Total runtime: 9175.859 ms
> (4 rows)
> 
> 
> wastac=> explain analyze select count(*) from wastac.t_tile_geometry 
> where ST_Intersects(border, 
> ST_GeographyFromText('SRID=4326;POLYGON((116.751709 
> -31.381779,116.883545 -32.676373,114.741211 -32.796510,114.796143 
> -31.316101,116.751709 -31.381779))'));
> 
>  Aggregate  (cost=364056.80..364056.81 rows=1 width=0) (actual 
> time=8854.932..8854.933 rows=1 loops=1)
>    ->  Seq Scan on t_tile_geometry  (cost=0.00..362993.14 rows=425463 
> width=0) (actual time=2017.629..8854.879 rows=95 loops=1)
>          Filter: st_intersects(border, 
> '0103000020E61000000100000005000000F8C610001C305D40B24CBF44BC613FC0D6E253008C385D40DE72F563935640C0DF1B430070AF5C40EE77280A
> F46540C01EFCC401F4B25C409F3BC1FEEB503FC0F8C610001C305D40B24CBF44BC613FC0'::geography)
>  Total runtime: 8854.976 ms
> (4 rows)
> 
> 
> wastac=> explain analyze select count(*) from wastac.t_tile_geometry 
> where border && ST_GeographyFromText('SRID=4326;POLYGON((116.751709 
> -31.381779,116.883545 -32.676373,114.741211 -32.796510,114.796143 
> -31.316101,116.751709 -31.381779))');
> 
>  Aggregate  (cost=28.99..29.00 rows=1 width=0) (actual 
> time=24.443..24.443 rows=1 loops=1)
>    ->  Index Scan using t_tile_geometry_border_key on t_tile_geometry 
>  (cost=0.00..28.97 rows=6 width=0) (actual time=9.952..24.407 rows=112 
> loops=1)
>          Index Cond: (border && 
> '0103000020E61000000100000005000000F8C610001C305D40B24CBF44BC613FC0D6E253008C385D40DE72F563935640C0DF1B430070AF5C40EE77280AF46540C
> 01EFCC401F4B25C409F3BC1FEEB503FC0F8C610001C305D40B24CBF44BC613FC0'::geography)
>  Total runtime: 24.681 ms

Right, because && is an index-only bounding box search (and so doesn't 
require access to the heap unless you are using an older version of 
PostGIS) whereas ST_Intersects() calculates the intersection predicate 
based upon all points within the geometry (time consuming if they have 
lots of points).

Incidentally, you've missed two of the most important bits of 
information - the version of PostgreSQL and the version of PostGIS you 
are using.

What does the output of:

SELECT version(), postgis_full_version();

return?

ATB,

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