Indeed, this may be useful for partition pruning.
I am also curious about why this has not been achieved.

Wenjing <wenjing....@alibaba-inc.com> 于2021年8月23日周一 上午10:46写道:

> Hi Hackers,
>
> Recently, a issue has been bothering me, This is about conditional
> push-down in SQL.
> I use cases from regression testing as an example.
> I found that the conditions  (B =1)  can be pushed down into the
> subquery, However, it cannot be pushed down to sublink/subplan.
> If a sublink/subplan clause contains a partition table, it can be useful
> to get the conditions for pruning.
> So, is it worth pushing conditions to sublink/subplan?
> Anybody have any ideas?
>
>
> regards,
> Wenjing
>
>
> example:
> create table p (a int, b int, c int) partition by list (a);
> create table p1 partition of p for values in (1);
> create table p2 partition of p for values in (2);
> create table q (a int, b int, c int) partition by list (a);
> create table q1 partition of q for values in (1) partition by list (b);
> create table q11 partition of q1 for values in (1) partition by list (c);
> create table q111 partition of q11 for values in (1);
> create table q2 partition of q for values in (2) partition by list (b);
> create table q21 partition of q2 for values in (1);
> create table q22 partition of q2 for values in (2);
> insert into q22 values (2, 2, 3);
>
>
> postgres-# explain (costs off)
> postgres-# select temp.b  from
> postgres-# (
> postgres(# select a,b from ab x where x.a = 1
> postgres(# union all
> postgres(# (values(1,1))
> postgres(# ) temp,
> postgres-# ab y
> postgres-# where  y.b = temp.b and y.a = 1 and y.b=1;
>                     QUERY PLAN
> ---------------------------------------------------
>  Nested Loop
>    ->  Seq Scan on ab_a1_b1 y
>          Filter: ((b = 1) AND (a = 1))
>    ->  Append
>          ->  Subquery Scan on "*SELECT* 1"
>                ->  Seq Scan on ab_a1_b1 x
>                      Filter: ((a = 1) AND (b = 1))
>          ->  Result
> (8 rows)
>
> The conditions  (B =1)  can be pushed down into the subquery.
>
> postgres=# explain (costs off)
> postgres-# select
> postgres-# y.a,
> postgres-# (Select x.b from ab x where y.a =x.a and y.b=x.b) as b
> postgres-# from ab y where a = 1 and b = 1;
>                     QUERY PLAN
> ---------------------------------------------------
>  Seq Scan on ab_a1_b1 y
>    Filter: ((a = 1) AND (b = 1))
>    SubPlan 1
>      ->  Append
>            ->  Seq Scan on ab_a1_b1 x_1
>                  Filter: ((y.a = a) AND (y.b = b))
>            ->  Seq Scan on ab_a1_b2 x_2
>                  Filter: ((y.a = a) AND (y.b = b))
>            ->  Seq Scan on ab_a1_b3 x_3
>                  Filter: ((y.a = a) AND (y.b = b))
>            ->  Seq Scan on ab_a2_b1 x_4
>                  Filter: ((y.a = a) AND (y.b = b))
>            ->  Seq Scan on ab_a2_b2 x_5
>                  Filter: ((y.a = a) AND (y.b = b))
>            ->  Seq Scan on ab_a2_b3 x_6
>                  Filter: ((y.a = a) AND (y.b = b))
>            ->  Seq Scan on ab_a3_b1 x_7
>                  Filter: ((y.a = a) AND (y.b = b))
>            ->  Seq Scan on ab_a3_b2 x_8
>                  Filter: ((y.a = a) AND (y.b = b))
>            ->  Seq Scan on ab_a3_b3 x_9
>                  Filter: ((y.a = a) AND (y.b = b))
> (22 rows)
>
> The conditions (B = 1 and A = 1) cannot be pushed down to sublink/subplan
> in targetlist.
>
> postgres=# explain (costs off)
> postgres-# select y.a
> postgres-# from ab y
> postgres-# where
> postgres-# (select x.a > x.b from ab x where y.a =x.a and y.b=x.b) and
> postgres-# y.a = 1 and y.b = 1;
>                     QUERY PLAN
> ---------------------------------------------------
>  Seq Scan on ab_a1_b1 y
>    Filter: ((a = 1) AND (b = 1) AND (SubPlan 1))
>    SubPlan 1
>      ->  Append
>            ->  Seq Scan on ab_a1_b1 x_1
>                  Filter: ((y.a = a) AND (y.b = b))
>            ->  Seq Scan on ab_a1_b2 x_2
>                  Filter: ((y.a = a) AND (y.b = b))
>            ->  Seq Scan on ab_a1_b3 x_3
>                  Filter: ((y.a = a) AND (y.b = b))
>            ->  Seq Scan on ab_a2_b1 x_4
>                  Filter: ((y.a = a) AND (y.b = b))
>            ->  Seq Scan on ab_a2_b2 x_5
>                  Filter: ((y.a = a) AND (y.b = b))
>            ->  Seq Scan on ab_a2_b3 x_6
>                  Filter: ((y.a = a) AND (y.b = b))
>            ->  Seq Scan on ab_a3_b1 x_7
>                  Filter: ((y.a = a) AND (y.b = b))
>            ->  Seq Scan on ab_a3_b2 x_8
>                  Filter: ((y.a = a) AND (y.b = b))
>            ->  Seq Scan on ab_a3_b3 x_9
>                  Filter: ((y.a = a) AND (y.b = b))
> (22 rows)
>
> The conditions  (B=1 and A=1)  cannot be pushed down to sublink/subplan in
> where clause.
>
>
>
>

Reply via email to