I had hoped and expected that it would do B (push down project and
filter expressions) or C (push down project expressions) but in fact
it does A (keep expressions in the same place, but add a project to
the input that just narrows the columns to just those needed.

I agree with Stamatis' that for optimization, A is usually superior.
It narrows the set of fields early (therefore reducing copying & IO)
but doesn't pay the price of computation until after the Filter has
reduced the number of rows.

I also agree with Stamatis that B usually fattens tuples. But there is
a case where B can slim tuples - if you don't need x and y but only
the expression "x + y", then if you compute "x + y" early, you have
made the tuple slimmer (but paid the price of computing a value that
might be thrown away by the Filter).

However, I do think there is a use for cases B and C; I plan to build
them as part of https://issues.apache.org/jira/browse/CALCITE-3975,
adding some parameters to ProjectFilterTransposeRule.

Julian

On Wed, May 27, 2020 at 4:05 PM Stamatis Zampetakis <zabe...@gmail.com> wrote:
>
> Hello,
>
> I looked into the rule recently but to be honest I already forgot what it
> really does.
>
> Expect: B
> Hope: A
> Comments:
> Judging by the name I would expect B, pushing as much as possible from the
> top project but not altering the filter.
> In the end it is just a transpose.
>
> On the other hand, I would use the rule mostly as an alternative to
> RelFieldTrimmer (along with other rules) in order
> to prune out unnecessary columns as early as possible. Thus, I think option
> A is what I would like.
>
> If it works like B then in some cases it could have also the opposite
> effect of what I would like; fattening the tuples
> instead of slimming them down.
>
> SELECT sal, comm, sal + comm AS remuneration, sal * 0.45 AS incometax, sal
> * 0.03 AS surchargetax
> FROM Emp
> WHERE deptno = 10
>
> SELECT sal, comm, renumeration, incometax, surchargetax
> FROM (
>   SELECT sal, comm, sal + comm AS remuneration, sal * 0.45 As incometax,
> sal * 0.03 AS surchargetax, deptno
>   FROM Emp)
> WHERE deptno = 10
>
> Best,
> Stamatis
>
> PS. I will go now and check what the rule does :)
>
>
> On Wed, May 27, 2020 at 8:45 PM Julian Hyde <jh...@apache.org> wrote:
>
> > As part of https://issues.apache.org/jira/browse/CALCITE-3975, I've
> > been looking into what ProjectFilterTransposeRule does with
> > expressions. It's one of our oldest rules, and I thought I knew what
> > it did. But the rule does not do what I expect. I've like to conduct a
> > straw poll to see what other people think.
> >
> > Consider the following query (a Project on top of a Filter on a Scan).
> >
> >   SELECT sal + comm AS remuneration
> >   FROM Emp
> >   WHERE deptno = 10
> >
> > After applying ProjectFilterTransposeRule, what result would you
> > expect? What would the ideal result be? Are there any extreme cases
> > (large project lists, complex expressions, expensive filter
> > expressions) where the rule should do something different?
> >
> > Please fill out the following:
> >
> >   Expect: <option A, B or C, or a query>
> >   Hope: <option A, B or C, or a query>
> >   Comments:
> >
> > Option A. Push down references to the fields needed by filter and
> > project expressions
> >
> >   SELECT sal + comm AS remuneration
> >   FROM (
> >     SELECT sal, comm, deptno
> >     FROM Emp)
> >   WHERE deptno = 10
> >
> > B. Push down the project expression, and references to the fields
> > needed by the filter
> >
> >   SELECT remuneration
> >   FROM (
> >     SELECT sal + comm  AS remuneration, deptno
> >     FROM Emp)
> >   WHERE deptno = 10
> >
> > C. Push down the project and filter expressions
> >
> >  SELECT remuneration
> >   FROM (
> >     SELECT sal + comm  AS remuneration, deptno = 10 AS predicate
> >     FROM Emp)
> >   WHERE predicate
> >
> > Julian
> >

Reply via email to