Thanks Julian and Justin.

What do you think the rule should be called? UnionFilterTransposeRule,
> perhaps?
>
SetOpFilterMergeRule?

 Maybe that problem does not occur when applied to UNION than when applied
> to UNION ALL.

Yes, This is very important.

There would seem to be analogous rules for INTERSECT (combine the
> conditions using AND) and EXCEPT (combine the conditions using AND NOT).
>
Excellent extensions, all the three operators process logic are:

For UNION:
New Filter = left Filter *OR* right Filter.

For INTERSECT:
New Filter = left Filter *AND* right Filter.

For EXCEPT:
If left Filter, right Filter have no overlap, transform to left child tree,
Otherwise
New Filter = left Filter *AND NOT *right Filter.

For UNION ALL:
Add prerequisites:
left Filter, right Filter must have no overlap.

For INTERSECT ALL:
Add prerequisites:
If left Filter, right Filter have no overlap, transform to empty values.
Otherwise
the rule can't be applied.

For EXCEPT ALL:
same for  EXCEPT.


work for N-way Union, not just 2-way Union.
>
Yes, I will add tests for this.

 And I think you should make it work whether or not a Project is present.

Ok, It seems I need construct several different operand match trees for
plan.

Hi Julian, what do you think of the above process logic?

Julian Hyde <jhyde.apa...@gmail.com> 于2022年1月20日周四 10:18写道:

> Justin,
>
> For planning table or index scans, I would recommend using a single
> TableScan with a Filter that uses a Sarg, rather than using multiple
> TableScans connected by a Union. So I think this rule will be useful.
>
> But I do agree that this proposed rule is not a “no brainer”. It may not
> do what people want/expect in all cases, and therefore it probably should
> not be enabled it by default.
>
> Julian
>
>
>
>
>
> > On Jan 19, 2022, at 3:38 PM, Justin Swanhart <greenl...@gmail.com>
> wrote:
> >
> > Hi,
> >
> > Note that this will negate the optimization that one usually is looking
> for
> > when writing such queries:
> >
> > Select * from TAB where a = 1
> > UNION ALL
> > Select * from TAB where b = 1
> >
> > In a database with indexes (most databases) this will allow indexes to be
> > used on both the a column and the b column.
> > Databases with bitmap indexes or without indexes would benefit from the
> > rule.
> >
> > On Wed, Jan 19, 2022 at 4:32 PM Julian Hyde <jhyde.apa...@gmail.com
> <mailto:jhyde.apa...@gmail.com>> wrote:
> >
> >> Can you log a Jira case for this?
> >>
> >> I think you should make your rule work for N-way Union, not just 2-way
> >> Union. And I think you should make it work whether or not a Project is
> >> present.
> >>
> >>> On Jan 19, 2022, at 1:25 PM, Julian Hyde <jhyde.apa...@gmail.com>
> wrote:
> >>>
> >>> It sounds useful.
> >>>
> >>> What do you think the rule should be called? UnionFilterTransposeRule,
> >> perhaps?
> >>>
> >>> A challenge when writing the rule will be to ensure that all of the
> >> inputs to the Union are the same. The Volcano framework is not very
> good at
> >> that.
> >>>
> >>> You should be careful of the case that the conditions overlap. For
> >> example, the rewrite
> >>>
> >>>  SELECT * FROM Emp WHERE deptno < 30
> >>>  UNION ALL
> >>>  SELECT * FROM Emp WHERE deptno IN (25, 35, 45)
> >>>
> >>> to
> >>>
> >>>  SELECT * FROM Emp WHERE deptno < 30 OR deptno IN (25, 35, 45)
> >>>
> >>> Is not valid, because rows with deptno = 25 will appear twice in the
> >> first query, once in the second. Maybe that problem does not occur when
> >> applied to UNION than when applied to UNION ALL.
> >>>
> >>> There would seem to be analogous rules for INTERSECT (combine the
> >> conditions using AND) and EXCEPT (combine the conditions using AND NOT).
> >> Perhaps one rule could cover all set operations (see
> >> FilterSetOpTransposeRule).
> >>>
> >>> Julian
> >>>
> >>>
> >>>
> >>>> On Jan 19, 2022, at 2:38 AM, Yanjing Wang <zhuangzixiao...@gmail.com
> >> <mailto:zhuangzixiao...@gmail.com <mailto:zhuangzixiao...@gmail.com>>>
> wrote:
> >>>>
> >>>> A simple example is converting SELECT a, b FROM t WHERE c = 1 UNION
> ALL
> >> SELECT a, b FROM t WHERE c = 2 to SELECT a, b FROM t WHERE c in (1, 2)
> >>>>
> >>>> Yanjing Wang <zhuangzixiao...@gmail.com <mailto:
> zhuangzixiao...@gmail.com> <mailto:
> >> zhuangzixiao...@gmail.com <mailto:zhuangzixiao...@gmail.com>>>
> 于2022年1月19日周三 18:35写道:
> >>>> Hi, community
> >>>>
> >>>> Here I recommend a new rule for converting UNION ALL sub plan to a
> >> single input with an OR filter, the following is its conversion diagram.
> >>>>
> >>>>
> >>>> The conversion prerequisites are
> >>>> 1. left filter range has no intersection with right filter range.
> >>>> 2. Project and Input Sub Tree must be identical.
> >>>>
> >>>> The rule will be used when Input Sub Tree is a computing-intensive or
> >> large IO operation.
> >>>>
> >>>> I don't know whether the community supports it or not, any suggestions
> >> will be appreciated.
>
>

Reply via email to