You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Ruben Quesada Lopez (JIRA)" <ji...@apache.org> on 2019/04/01 08:33:00 UTC
[jira] [Created] (CALCITE-2967) New rule to remove SemiJoin
Ruben Quesada Lopez created CALCITE-2967:
--------------------------------------------
Summary: New rule to remove SemiJoin
Key: CALCITE-2967
URL: https://issues.apache.org/jira/browse/CALCITE-2967
Project: Calcite
Issue Type: New Feature
Reporter: Ruben Quesada Lopez
(As far as I know, there is no rule to achieve what I am about to describe, if there exists already a way to do it, please let me know).
In some specific situations, a SemiJoin can be completely removed and replaced by its left child with an appropriate transformed filter.
Let us say we want to retrieve all employees whose department satisfy a certain condition, i.e.:
{code}
SELECT * from Employee e
WHERE e.deptno IN
(SELECT d.deptno FROM Department d
WHERE <condition>)
{code}
Which would translate to something like:
{code}
SemiJoin (e.deptno=d.deptno)
Scan (table=Employee as e)
Filter(<condition>)
Scan (table=Department as d)
{code}
In a "normal" scenario, e.g. "all employees from Sales department", the plan could no be simplified:
{code}
SemiJoin (e.deptno=d.deptno)
Scan (table=Employee as e)
Filter(d.name="Sales")
Scan (table=Department as d)
{code}
But with a specific condition, based on deptno, e.g. "all employees whose deptno is greater than 10":
{code}
SemiJoin (e.deptno=d.deptno)
Scan (table=Employee as e)
Filter(d.deptno>10)
Scan (table=Department as d)
{code}
The plan could be simplified: the SemiJoin is not actually needed, we can perform the query with a single scan and a converted filter:
{code}
Filter(e.deptno>10)
Scan (table=Employee as e)
{code}
The goal would be to provide a new rule to achieve that (since there is already a SemiJoinRemoveRule, we could name this new rule as e.g. SemiJoinSimplifyRule?).
I know that, ideally, this rule should not be needed because the plan could be directly written without the SemiJoin, but let's say that we are in a situation were the plan is systematically generated with the same pattern, and there is no way to know in advanced the filter condition that will be used within.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)