[postgis-users] Postgis intersect query with limit does not use spatial index

Alex Reitbort alex at skylinesoft.com
Tue Jul 29 03:05:05 PDT 2014


Hello,

 

I am  using Postgre 9.3.4 with postgis 2.1.3

"PostgreSQL 9.3.4, compiled by Visual C++ build 1600, 64-bit POSTGIS="2.1.3
r12547" GEOS="3.4.2-CAPI-1.8.2 r3924" PROJ="Rel. 4.8.0, 6 March 2012"
GDAL="GDAL 1.10.0, released 2013/04/24" LIBXML="2.7.8" LIBJSON="UNKNOWN"
RASTER"

 

I have a spatial table with 100 000 000 rows. This table has two columns
sgid (primary key) and way(geometry(MultiPolygon,4326)). There is a spatial
index on the spatial column.

 

What I want to know if there are any rows in specified rectangular bbox. For
this I tried using && spatial operator with limit clause.

Here is a my query:

select * from "public"."osm_buildings" where "public"."osm_buildings"."way"
&& ST_SetSRID('BOX(-101.77734375 35.5078125,-101.6015625
35.68359375)'::box2d,4326) limit 1;

 

When I execute this query without limit clause, it uses the spatial index
and returns me the results in 20ms. 

This is the results of explain analyze

"Bitmap Heap Scan on osm_buildings  (cost=876627.31..4408250.75
rows=21800115 width=160)"

"  Recheck Cond: (way &&
'0103000020E6100000010000000500000000000000C07159C00000000000C1414000000000C
07159C00000000080D7414000000000806659C00000000080D7414000000000806659C000000
00000C1414000000000C07159C00000000000C14140'::geometry)"

"  ->  Bitmap Index Scan on osm_buildings_index  (cost=0.00..871177.29
rows=21800115 width=0)"

"        Index Cond: (way &&
'0103000020E6100000010000000500000000000000C07159C00000000000C1414000000000C
07159C00000000080D7414000000000806659C00000000080D7414000000000806659C000000
00000C1414000000000C07159C00000000000C14140'::geometry)"

 

 

However when I execute this query with limit clause it decides to do a full
table scan without using the index and takes more than 15 seconds to finish.

This is the explain analyze for query with limit clause:

"Limit  (cost=0.00..0.21 rows=1 width=160)"

"  ->  Seq Scan on osm_buildings  (cost=0.00..4621629.20 rows=21800115
width=160)"

"        Filter: (way &&
'0103000020E6100000010000000500000000000000C07159C00000000000C1414000000000C
07159C00000000080D7414000000000806659C00000000080D7414000000000806659C000000
00000C1414000000000C07159C00000000000C14140'::geometry)"

 

 

How can I force the query with limit to use the index? What query can I use
to check if there is any data in required bbox?

 

 

Alex Reitbort

Software Developer

Skyline Software Systems Inc.

www.skylineglobe.com

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20140729/8c4717de/attachment.html>


More information about the postgis-users mailing list