Re: cached plans and enable_partition_pruning

From: Andres Freund <andres(at)anarazel(dot)de>
To: Amit Langote <Langote_Amit_f8(at)lab(dot)ntt(dot)co(dot)jp>
Cc: Pg Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: cached plans and enable_partition_pruning
Date: 2018-07-23 14:20:35
Message-ID: 20180723142035.hwaqctw4fbpyz3y4@alap3.anarazel.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,

On 2018-07-23 18:31:43 +0900, Amit Langote wrote:
> It seems that because enable_partition_pruning's value is only checked
> during planning, turning it off *after* a plan is created and cached does
> not work as expected.
>
> create table p (a int) partition by list (a);
> create table p1 partition of p for values in (1);
> create table p1 partition of p for values in (2);
>
> -- force a generic plan so that run-time pruning is used in the plan
> reset enable_partition_pruning;
> set plan_cache_mode to force_generic_plan;
> prepare p as select * from p where a = $1;
>
> explain (costs off, analyze) execute p (1);
> QUERY PLAN
> ────────────────────────────────────────────────────────────────
> Append (actual time=0.079..0.106 rows=1 loops=1)
> Subplans Removed: 1
> -> Seq Scan on p2 (actual time=0.058..0.068 rows=1 loops=1)
> Filter: (a = $1)
> Planning Time: 17.573 ms
> Execution Time: 0.396 ms
> (6 rows)
>
> set enable_partition_pruning to off;
>
> explain (costs off, analyze) execute p (1);
> QUERY PLAN
> ────────────────────────────────────────────────────────────────
> Append (actual time=0.108..0.135 rows=1 loops=1)
> Subplans Removed: 1
> -> Seq Scan on p2 (actual time=0.017..0.028 rows=1 loops=1)
> Filter: (a = $1)
> Planning Time: 0.042 ms
> Execution Time: 0.399 ms
> (6 rows)
>
> Pruning still occurs, whereas one would expect it not to, because the plan
> (the Append node) contains run-time pruning information, which was
> initialized because enable_partition_pruning was turned on when the plan
> was created.
>
> Should we check its value during execution too, as done in the attached?

I think it's correct to check the plan time value, rather than the
execution time value. Other enable_* GUCs also take effect there, and I
don't see a problem with that?

Greetings,

Andres Freund

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Alexander Korotkov 2018-07-23 14:21:43 Re: [HACKERS] Bug in to_timestamp().
Previous Message Andres Freund 2018-07-23 14:14:35 Re: [HACKERS] logical decoding of two-phase transactions