OSDir


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: JoinPushThroughJoinRule not applied on plan


Query: 
SELECT X.a FROM X LEFT JOIN Y ON X.b=Y.c INNER JOIN (SELECT X.a FROM X) t ON X.a=t.a;

102:LogicalProject(a=[$0])
  101:LogicalJoin(condition=[=($0, $3)], joinType=[inner])
    98:LogicalJoin(condition=[=($1, $2)], joinType=[left])
      96:EnumerableTableScan(table=[[X]])
      97:EnumerableTableScan(table=[[Y]])
    100:LogicalProject(a=[$0])
      99:EnumerableTableScan(table=[[X]])

Root {kind: SELECT, rel: EnumerableProject#173, rowType: RecordType(BIGINT a), fields: [<0, a>], collation: []}
173:EnumerableProject(a=[$1])
  172:EnumerableJoin(condition=[=($0, $1)], joinType=[inner])
    170:EnumerableProject(a=[$0])
      96:EnumerableTableScan(table=[[X]])
    171:EnumerableJoin(condition=[=($1, $2)], joinType=[left])
      96:EnumerableTableScan(table=[[X]])
      97:EnumerableTableScan(table=[[Y]])



Schema:

Table X:
Column    Type
     a         bigint not null
     b         bigint not null

Table Y:
Column   Type
      c       bigint not null

On 2018/05/14 20:36:28, Vitalii Diravka <vitalii.diravka@xxxxxxxxx> wrote: 
> Check yours intermediate RelNode plan, which is going to be improved by
> this rule. The operands and their ordering are important in matching of the
> rules.
> https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/rel/rules/JoinPushThroughJoinRule.java#L87
> 
> From your case the rule should match. Could you share please the plan?
> 
> Kind regards
> Vitalii
> 
> 
> On Tue, May 8, 2018 at 4:24 PM aishwaryaanns@xxxxxxxxx <
> aishwaryaanns@xxxxxxxxx> wrote:
> 
> > Okay let me rephrase my question.
> >
> > I am executing a query having inner and left join. The plan generated by
> > calcite for that query is like
> >
> >            inner
> >             /     \
> >          left      C
> >         /    \
> >        A      B
> >
> > But it would be better if it proceeds inner join first, as the row count
> > will be reduced further to proceed left join. So the plan needed is,
> >
> >             left
> >             /     \
> >        inner     B
> >         /    \
> >        A      C
> >
> > So I read through the documentation and found JoinPushThroughJoinRule will
> > do so. So I tried applying them (Till now, I am giving only row count to
> > statistics). But no change in the plan.
> >
> > Then I found onMatch() in JoinPushThroughJoinRule.java has
> > not been called at all.
> >
> > How can this be resolved?
> >
> >
> > On 2018/05/04 14:23:00, Michael Mior <mmior@xxxxxxxxxxxx> wrote:
> > > I have no immediate answers, but it would be helpful if you could
> > provide a
> > > complete working example of code that exhibits the problem.
> > >
> > > --
> > > Michael Mior
> > > mmior@xxxxxxxxxxxx
> > >
> > >
> > > Le ven. 4 mai 2018 à 03:58, Valli Annamalai <aishwaryaanns@xxxxxxxxx> a
> > > écrit :
> > >
> > > > I wanted to apply JoinPushThroughJoinRule.LEFT and
> > > > JoinPushThroughJoinRule.RIGHT to the plan for optimization. So I added
> > > > those 2 rules to Program and ran it as a sequence of programs.
> > > >
> > > > But I am not getting plan applied with these rules
> > > >
> > > > I did read [here
> > > > <
> > > >
> > https://issues.apache.org/jira/browse/CALCITE-457?focusedCommentId=14205221&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-14205221
> > > > >]
> > > > that adding rules does not mean that the plan will be better. So sanity
> > > > checks may fail. In my case, during onMatch() checks (in matchRecurse()
> > > > from ValcanoRuleCall.java), it fails because of no parents for the
> > subsets
> > > > (getParentRels() returns empty list) .
> > > >
> > > > Thus there are no successors and the recursion has not been trigerred.
> > So
> > > > the rules has not been fired (onMatch() in
> > JoinPushThroughJoinRule.java has
> > > > not been called at all). What can be done for that?
> > > >
> > > > Any other flags need to be enabled or rules to be added??
> > > >
> > > >
> > > > Thanks in advance
> > > >
> > >
> >
>