Re: Continued performance regression from 3.5.0 with 3.5.1 using ST_Contains

Paul Ramsey <[email protected]>
Newsgroups gmane.comp.gis.postgis
Message-ID <[email protected]>
What was previous “fast” version? What were reference performance numbers on *that* version?
Can you provide the affected data?
That last “small” query looks pretty fast (half a milisecond). 
P

> On Dec 26, 2024, at 9:39 AM, Daryl Herzmann <[email protected]> wrote:
> 
> Howdy All,
> 
> I saw some list traffic about a performance regression introduced with
> postgis 3.5.0 using ST_Within and I figured what I was observing was
> perhaps the same issue.  I am now using postgis 3.5.1 and am still
> seeing my performance problem, so I figured I had better chime in here
> to see what I could be doing wrong :)
> 
> My environment is Rocky Linux 9 64bit with pgrpms:
> 
> POSTGIS="3.5.1 48ab069" [EXTENSION] PGSQL="170"
> GEOS="3.13.0-CAPI-1.19.0" PROJ="9.4.1 NETWORK_ENABLED=OFF
> URL_ENDPOINT=https://cdn.proj.org
> USER_WRITABLE_DIRECTORY=/var/lib/pgsql/.local/s
> hare/proj DATABASE_PATH=/usr/proj94/share/proj/proj.db" (compiled
> against PROJ 9.5.1) LIBXML="2.9.13" LIBJSON="0.14" LIBPROTOBUF="1.3.3"
> WAGYU="0.5.0 (Internal)"
> 
> I notice that proj version mismatch, so I am unsure if that is at play or not...
> 
> A common explain analyze looks like so:
> 
> postgis=# explain (analyze, buffers) select count(*) from
> spc_outlook_geometries where st_contains(geom, ST_Point(-95, 42,
> 4326));
> 
>     QUERY PLAN
> ------------------------------------------------------------------------------------------------------------------------------------------------------------------
> Aggregate  (cost=14.80..14.81 rows=1 width=8) (actual
> time=11745.230..11745.231 rows=1 loops=1)
>   Buffers: shared hit=572500 read=23000
>   ->  Index Scan using spc_outlook_geometries_gix on
> spc_outlook_geometries  (cost=0.28..14.80 rows=1 width=0) (actual
> time=0.122..11738.404 rows=49009 loops=1)
>         Index Cond: (geom ~
> '0101000020E61000000000000000C057C00000000000004540'::geometry)
>         Filter: st_contains(geom,
> '0101000020E61000000000000000C057C00000000000004540'::geometry)
>         Rows Removed by Filter: 116312
>         Buffers: shared hit=572500 read=23000
> Planning Time: 0.172 ms
> Execution Time: 11745.475 ms
> (9 rows)
> 
> The relation looks like so.
> 
> postgis=# \d spc_outlook_geometries
>                     Table "public.spc_outlook_geometries"
>     Column     |            Type             | Collation | Nullable | Default
> ----------------+-----------------------------+-----------+----------+---------
> spc_outlook_id | integer                     |           |          |
> threshold      | character varying(4)        |           |          |
> category       | character varying(64)       |           |          |
> geom           | geometry(MultiPolygon,4326) |           |          |
> geom_layers    | geometry(MultiPolygon,4326) |           |          |
> Indexes:
>    "spc_outlook_geometries_combo_idx" btree (threshold, category)
>    "spc_outlook_geometries_gix" gist (geom)
>    "spc_outlook_geometries_idx" btree (spc_outlook_id)
>    "spc_outlook_geometries_layers_gix" gist (geom_layers)
> Check constraints:
>    "_sog_geom_isvalid" CHECK (st_isvalid(geom))
>    "_sog_geom_layers_isvalid" CHECK (st_isvalid(geom_layers))
> Foreign-key constraints:
>    "spc_outlook_geometries_threshold_fkey" FOREIGN KEY (threshold)
> REFERENCES spc_outlook_thresholds(threshold)
> 
> Even a "cheaper" query takes considerable time.
> 
> postgis=# explain (analyze, buffers) select st_area(geom) from
> spc_outlook_geometries where st_contains(geom, ST_Point(-95, 42,
> 4326)) LIMIT 10;
> 
> QUERY PLAN
> -----------------------------------------------------------------------------------------------------------------------------------------------------------
> Limit  (cost=0.28..14.93 rows=1 width=8) (actual time=0.115..0.643
> rows=10 loops=1)
>   Buffers: shared hit=90
>   ->  Index Scan using spc_outlook_geometries_gix on
> spc_outlook_geometries  (cost=0.28..14.93 rows=1 width=8) (actual
> time=0.115..0.641 rows=10 loops=1)
>         Index Cond: (geom ~
> '0101000020E61000000000000000C057C00000000000004540'::geometry)
>         Filter: st_contains(geom,
> '0101000020E61000000000000000C057C00000000000004540'::geometry)
>         Rows Removed by Filter: 57
>         Buffers: shared hit=90
> Planning Time: 0.086 ms
> Execution Time: 0.657 ms
> 
> thank you for your time!
> daryl
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.