Re: Partitioning (constraint exclusion involving joins)

From: Justin Pryzby <pryzby(at)telsasoft(dot)com>
To: pgsql-general(at)postgresql(dot)org
Cc: Krithika Venkatesh <krithikavenkatesh31(at)gmail(dot)com>
Subject: Re: Partitioning (constraint exclusion involving joins)
Date: 2017-07-25 13:16:50
Message-ID: 20170725131650.GA30519@telsasoft.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Tue, Jul 25, 2017 at 06:21:43PM +0530, Krithika Venkatesh wrote:
> I have a table that is partitioned on a numeric column (ID).
>
> Partitioning works when I query the table with no joins.
>
> SELECT * FROM TABLE A a WHERE ID IN (SELECT ID FROM TABLE B b WHERE
> CREATED_TS = CURRENT_TIMESTAMP)
>
> Partitioning doesn't work when I do join.
>
> SELECT A.* FROM TABLE A a INNER JOIN TABLE B b ON a.ID = b.ID.

I think you mean "constraint exclusion doesn't work when yo do a join",

which is because it only works on simple values compiled before the planner
gets to see them:

main=# explain SELECT COUNT(1) FROM eric_enodeb_metrics WHERE start_time>now(); -- -'999 minutes'::interval;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=62.44..62.45 rows=1 width=8)
-> Append (cost=0.00..62.40 rows=14 width=0)
-> Seq Scan on eric_enodeb_metrics (cost=0.00..0.00 rows=1 width=0)
Filter: (start_time > now())
-> Index Only Scan using eric_enodeb_201607_idx on eric_enodeb_201607 (cost=0.42..4.44 rows=1 width=0)
Index Cond: (start_time > now())
-> Index Only Scan using eric_enodeb_201608_idx on eric_enodeb_201608 (cost=0.42..4.44 rows=1 width=0)
Index Cond: (start_time > now())
-> Index Only Scan using eric_enodeb_201609_idx on eric_enodeb_201609 (cost=0.42..4.44 rows=1 width=0)
Index Cond: (start_time > now())

https://www.postgresql.org/docs/current/static/ddl-partitioning.html
|The following caveats apply to constraint exclusion:
| Constraint exclusion only works when the query's WHERE clause contains
|constants (or externally supplied parameters). For example, a comparison
|against a non-immutable function such as CURRENT_TIMESTAMP cannot be optimized,
|since the planner cannot know which partition the function value might fall
|into at run time.
[..]

.. and see an early mail on its implementation, here:
https://www.postgresql.org/message-id/1121251997.3970.237.camel@localhost.localdomain

Justin

In response to

  • Partitioning at 2017-07-25 12:51:43 from Krithika Venkatesh

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Krithika Venkatesh 2017-07-25 14:20:44 Re: Partitioning (constraint exclusion involving joins)
Previous Message Krithika Venkatesh 2017-07-25 12:51:43 Partitioning