Re: Fwd: Declarative partitioning and partition pruning/check (+postgis)

From: Justin Pryzby <pryzby(at)telsasoft(dot)com>
To: Mats Taraldsvik <mats(dot)taraldsvik(at)gmail(dot)com>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: Fwd: Declarative partitioning and partition pruning/check (+postgis)
Date: 2022-04-19 13:39:28
Message-ID: 20220419133928.GG26620@telsasoft.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general pgsql-hackers

On Tue, Apr 19, 2022 at 02:39:12PM +0200, Mats Taraldsvik wrote:
> I'm re-trying this email here, as there were no answers in the psql-general
> list. Hope that's ok. (please cc me when answering as I'm not subscribed
> (yet) )

-hackers is for development and bug reports, so this isn't the right place.
If you had mailed on -performance, I would have responded there.

> The first part, getting the rows into the "right" partition isn't
> especially interesting: Reduce every geometry to a point, and use the x and
> y coordinates separately in a range partition. This is possible with
> PostgreSQL as it is a normal range partition on double.

I agree that it's conceptually simple. Have you tried it ?

ts=# CREATE TABLE t(a geometry) PARTITION BY RANGE(st_x(a));
ts=# CREATE TABLE t1 PARTITION OF t FOR VALUES FROM (1)to(2);
...

> The second part is more interesting. Whenever the spatial index is
> (implicitly or directly) used in a query, the partition pruning step
> (during execution) checks the spatial index's root bounding box to
> determine if the partition can be skipped.
>
> Is this possible to achieve in PostgreSQL? There is already a function in
> PostGIS to get the spatial index root bounding box
> (_postgis_index_extent(tbl regclass, col text)), but I think the real issue
> is that the actual SQL query might not even call the index directly (SELECT
> * FROM a WHERE ST_Intersects(mygeom, a.geom) - the ST_Intersects function
> uses the index internally).

For partition pruning to work, a query would have to include a WHERE clause
which is sufficient to prune the partitions. If the table is partitioned by
RANGE(st_x(col)), then the query would need to say "st_x(col) <= 11" (or
similar). If st_x() is compared to a constant, then partition pruning can
happen at planning time; if not, it might (since v11) happen at execution time.

https://www.postgresql.org/docs/current/ddl-partitioning.html#DDL-PARTITION-PRUNING

I doubt your queries would have the necesarily condition for this to do what
you want. It would be easy to 1) try; and then 2) post a question with the
necessary SQL to set up the test, and show what you've tried.

--
Justin

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Tom Lane 2022-04-19 15:38:49 Re: oldest xmin is far in the past :: BUT xmin is not available in system
Previous Message Mats Taraldsvik 2022-04-19 12:39:12 Fwd: Declarative partitioning and partition pruning/check

Browse pgsql-hackers by date

  From Date Subject
Next Message Alvaro Herrera 2022-04-19 13:45:22 minor MERGE cleanups
Previous Message Vedant Gokhale 2022-04-19 13:33:08 Proposal for New and improved website for pgjdbc (JDBC) for GSOC 2022