[postgis-users] ST_Contains() performance problem
Kevin Neufeld
kneufeld at refractions.net
Thu Apr 24 18:59:20 PDT 2008
Hi Stephan,
I find it curious that your old system has
"retyp=8 AND (geom && ...) AND contains(...)"
but you new system has
"(geom && ...) AND contains(...) AND regtyp=8"
I think PostgreSQL does short-circuit evaluation. Testing for integer
equality and dropping out of a filter clause is significantly faster
than testing a bounding box intersection, a contains operation, and then
finishing with a test for integer equality.
Are you sure you use the same query on both systems?
Cheers,
Kevin
Stephan Grüter wrote:
> Hi,
>
> after migration from PostgreSQL-8.2.4/PostGIS-1.2.1 to
> PostgreSQL-8.3.1/PostGIS-1.3.3
> I have massive performance problems doing point in polygon analyses
> with ST_Contains().
>
> Query:
>
> EXPLAIN ANALYZE
> SELECT geo.regcode, bez.name
> FROM reg.geometrien geo, reg.bezeichnungen bez
> WHERE geo.regtyp = 8
> AND geo.the_geom && GeomFromText('Point(682970.983613 246747.010965)',
> 21781)
> AND Contains(geo.the_geom, GeomFromText('Point(682970.983613
> 246747.010965)', 21781))
> AND geo.regtyp = bez.regtyp
> AND geo.regcode = bez.regcode;
>
> Old system:
>
> version: "PostgreSQL 8.2.4 on powerpc-apple-darwin8.10.1, compiled by
> GCC powerpc-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc.
> build 5363)"
> postgis_full_version: "POSTGIS="1.2.1" GEOS="2.2.3-CAPI-1.1.1"
> PROJ="Rel. 4.5.0, 22 Oct 2006" USE_STATS"
>
> "Nested Loop (cost=0.00..16.56 rows=1 width=18) (actual
> time=7.278..7.422 rows=1 loops=1)"
> " -> Index Scan using geometrien_geom_idx on geometrien geo
> (cost=0.00..8.27 rows=1 width=8) (actual time=7.089..7.231 rows=1
> loops=1)"
> " Index Cond: (the_geom &&
> '0020000001000055154124D7B5F79C1F86410E1ED81674D163'::geometry)"
> " Filter: ((regtyp = 8) AND (the_geom &&
> '0020000001000055154124D7B5F79C1F86410E1ED81674D163'::geometry) AND
> contains(the_geom,
> '0020000001000055154124D7B5F79C1F86410E1ED81674D163'::geometry))"
> " -> Index Scan using bezeichnungen_pkey on bezeichnungen bez
> (cost=0.00..8.27 rows=1 width=20) (actual time=0.155..0.157 rows=1
> loops=1)"
> " Index Cond: ((bez.regtyp = 8) AND (geo.regcode = bez.regcode))"
> "Total runtime: 7.893 ms"
>
> New system:
>
> version: "PostgreSQL 8.3.1 on i386-apple-darwin9.2.0, compiled by GCC
> i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5465)"
> postgis_full_version: "POSTGIS="1.3.3" GEOS="3.0.0-CAPI-1.4.1"
> PROJ="Rel. 4.6.0, 21 Dec 2007" USE_STATS"
>
> "Nested Loop (cost=0.00..16.56 rows=1 width=15) (actual
> time=7306.497..7362.836 rows=1 loops=1)"
> " -> Index Scan using geometrien_geom_idx on geometrien geo
> (cost=0.00..8.27 rows=1 width=8) (actual time=7306.475..7362.812
> rows=1 loops=1)"
> " Index Cond: (the_geom &&
> '010100002015550000861F9CF7B5D7244163D17416D81E0E41'::geometry)"
> " Filter: ((the_geom &&
> '010100002015550000861F9CF7B5D7244163D17416D81E0E41'::geometry) AND
> contains(the_geom,
> '010100002015550000861F9CF7B5D7244163D17416D81E0E41'::geometry) AND
> (regtyp = 8))"
> " -> Index Scan using bezeichnungen_pkey on bezeichnungen bez
> (cost=0.00..8.27 rows=1 width=17) (actual time=0.015..0.016 rows=1
> loops=1)"
> " Index Cond: ((bez.regtyp = 8) AND (bez.regcode = geo.regcode))"
> "Total runtime: 7362.916 ms"
>
> Thanks for any help
>
>
> Stephan Grüter
>
> Wüest & Partner
> Gotthardstr. 6
> 8002 Zürich
> 044 289 90 32
>
>
>
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
More information about the postgis-users
mailing list