[postgis-users] Does anyone have multipolygons with large numbersof polygons
Kevin Neufeld
kneufeld at refractions.net
Fri Apr 18 11:20:17 PDT 2008
Obe, Regina wrote:
> Not sure the answer to your questions since I don't know much about
> the internals of PostgreSQL. I always assumed by ref for large objects.
>
> We could try to force it to calculate the numpoints call only once and
> see if it makes a difference in timings
>
> Something of the form
>
> SELECT pointn(t.the_geom, g.n) As poly
> FROM (SELECT the_geom, numpoints(the_geom) As np FROM kneufeld.tmp) t
> CROSS JOIN pgis_gs g
> WHERE g.n <= np;
>
EXPLAIN ANALYZE
SELECT pointn(t.the_geom, g.n) As poly
FROM (SELECT the_geom, numpoints(the_geom) As np FROM kneufeld.tmp) t
CROSS JOIN pgis_gs g
WHERE g.n <= np;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------
Nested Loop (cost=0.00..491.02 rows=10000 width=339665) (actual
time=7.498..78410.522 rows=21227 loops=1)
-> Seq Scan on tmp (cost=0.00..1.01 rows=1 width=339661) (actual
time=0.009..0.016 rows=1 loops=1)
-> Index Scan using pgis_gs_pkey on pgis_gs g (cost=0.00..315.01
rows=10000 width=4) (actual time=0.048..222.032 rows=21227 loops=1)
Index Cond: (g.n <= numpoints(tmp.the_geom))
Total runtime: 78518.345 ms
Total runtime: 79292.140 ms
Time: 78779.260 ms
Nope... didn't work. The query planner came up with the same query (for
the 20000 point linestring).
-- This is our first attempt
EXPLAIN ANALYZE
SELECT pointn(t.the_geom, g.n) As poly
FROM kneufeld.tmp t
CROSS JOIN pgis_gs g
WHERE g.n <= numpoints(the_geom);
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------
Nested Loop (cost=0.00..491.02 rows=10000 width=339665) (actual
time=7.472..78697.168 rows=21227 loops=1)
-> Seq Scan on tmp t (cost=0.00..1.01 rows=1 width=339661) (actual
time=0.011..0.016 rows=1 loops=1)
-> Index Scan using pgis_gs_pkey on pgis_gs g (cost=0.00..315.01
rows=10000 width=4) (actual time=0.047..211.865 rows=21227 loops=1)
Index Cond: (g.n <= numpoints(t.the_geom))
Total runtime: 78805.605 ms
And this also didn't work...
CREATE TABLE kneufeld.with_count AS
SELECT the_geom, numpoints(the_geom) As np FROM kneufeld.tmp;
EXPLAIN ANALYZE
SELECT pointn(t.the_geom, g.n) As poly
FROM kneufeld.with_count t
CROSS JOIN pgis_gs g
WHERE g.n <= np;
QUERY
PLAN
------------------------------------------------------------------------------------------------------------------------------------------
Nested Loop (cost=0.00..466.01 rows=10000 width=339665) (actual
time=3.764..78382.753 rows=21227 loops=1)
-> Seq Scan on with_count t (cost=0.00..1.01 rows=1 width=339665)
(actual time=0.008..0.013 rows=1 loops=1)
-> Index Scan using pgis_gs_pkey on pgis_gs g (cost=0.00..315.00
rows=10000 width=4) (actual time=0.048..215.288 rows=21227 loops=1)
Index Cond: (g.n <= t.np)
Total runtime: 78487.864 ms
Total runtime: 78396.653 ms
Any other thoughts?
>
> Also why are the timings for
> -- A linestring with 10532 points
>
> exactly the same in both cases or was that a bad cut and paste job :)
:) Good catch.. yes bad cut and paste. I ran again and got these values.
Total runtime: 18541.358 ms
Total runtime: 18636.428 ms
Total runtime: 18630.422 ms
>
> Thanks,
> Regina
>
Cheers,
Kevin
More information about the postgis-users
mailing list