[postgis-users] How could I improve this query?

Kevin Neufeld kneufeld at refractions.net
Tue Nov 23 10:26:07 PST 2010


Interesting thought.  Note though, Benjamin, that Jorge specified 
"a.min", not "b.min" in the filter clause.
-- Kevin


On 11/23/2010 10:07 AM, Benjamin Juhn wrote:
> You're current query is likely exploding your result set when table_a 
> records intersect with more than one record in table_b.  Assuming 
> there is no overlap of min & max values in table_b the following query 
> will stop testing for intersection between a & c records after find 
> one so it should run faster:
>
> UPDATE table_a a SET integer_field = b.integer_field
> FROM table_b b
> WHERE a.integer_field2 <= b.max AND a.integer_field2 >= b.min
>     AND EXISTS (SELECT true FROM table_c c WHERE st_intersects(a.geom, 
> c.geom) LIMIT 1);
>
> also I'm assuming you meant to reference b.min here:
>>
>>     table_a.integer_field2 >=
>>     table_a.min
>>
>
>
> On Nov 23, 2010, at 9:48 AM, David William Bitner wrote:
>
>> Jorge,
>>
>> What does running "explain analyze" give you for that query?
>>
>> db
>>
>> 2010/11/23 Jorge Arévalo <jorge.arevalo at deimos-space.com 
>> <mailto:jorge.arevalo at deimos-space.com>>
>
>>     Hello all,
>>
>>     The query:
>>
>>     update table_a set integer_field = table_b.integer_field from
>>     table_c,
>>     table_b where table_b.string_field = table_c.string_field and
>>     table_a.integer_field2 <= table_b.max and table_a.integer_field2 >=
>>     table_a.min and st_intersects(table_a.geom, table_c.geom)
>>
>>     Context:
>>     - Ubuntu 10.04, PostgreSQL 8.4.5, PostGIS 1.4.0, GEOS 3.1.0, PROJ
>>     4.7.1
>>     - table_a: a table with ~ 1500000 records. One geometry column of
>>     type
>>     POLYGON. SRID 23030, UTM coords.
>>     - table_b: a table with 3 integer fields and one string field. 88
>>     records.
>>     - table_c: a table with ~ 69000 records. One geometry column of type
>>     POLYGON. SRID 23030, UTM coords.
>>     - Indexes: GiST on geometry columns, btree in min, max (table_b),
>>
>>     The query takes about 15 min to finish in a 8-core Intel(R) Xeon
>>     2.50GHz, with 3 GB RAM. Would it be possible to reduce this time?
>>     I've
>>     changed some parameters in postgresql.conf, like "shared_buffers"
>>
>>     Things I think I could do (need to test it):
>>     - Change the string comparison by an integer-based one (I have only a
>>     limited set of string values).
>>     - Clustering geom indexes?
>>     - ...
>>
>>     Any suggestion welcome.
>>
>>     Thanks in advance,
>>
>>     --
>>     Jorge Arévalo
>>     Internet & Mobilty Division, DEIMOS
>>     jorge.arevalo at deimos-space.com
>>     <mailto:jorge.arevalo at deimos-space.com>
>>     http://mobility.grupodeimos.com/
>>     http://gis4free.wordpress.com <http://gis4free.wordpress.com/>
>>     _______________________________________________
>>     postgis-users mailing list
>>     postgis-users at postgis.refractions.net
>>     <mailto:postgis-users at postgis.refractions.net>
>>     http://postgis.refractions.net/mailman/listinfo/postgis-users
>>
>>
>>
>>
>> -- 
>> ************************************
>> David William Bitner
>> _______________________________________________
>> postgis-users mailing list
>> postgis-users at postgis.refractions.net 
>> <mailto:postgis-users at postgis.refractions.net>
>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>
>
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20101123/c9a822cb/attachment.html>


More information about the postgis-users mailing list