[
https://issues.apache.org/jira/browse/CALCITE-7936?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Zhen Chen updated CALCITE-7936:
-------------------------------
Description:
The top-down decorrelator can generate unnecessarily complex plans for nested
LATERAL queries. When a nested INNER Correlate has a left input that does not
reference any enclosing correlation variables, the current implementation still
joins that input with the outer correlation domain. This introduces a redundant
cross join and additional correlation columns into the generated plan.
For example, consider the following query with top-down decorrelation enabled:
{code:java}
WITH dept (deptno, dname) AS (
VALUES (10, 'ACCOUNTING'), (20, 'RESEARCH')
),
emp (empno, deptno, ename) AS (
VALUES (7369, 20, 'SMITH'),
(7782, 10, 'CLARK'),
(7499, 30, 'ALLEN')
)
SELECT *
FROM dept,
(VALUES 'A', 'M') AS v (v)
CROSS JOIN LATERAL (
SELECT *
FROM emp
WHERE emp.deptno = dept.deptno
AND POSITION(v.v IN emp.ename) > 0
) AS emp;
{code}
Here, the left input of the nested LATERAL join (`v`) is independent of `dept`,
while its right input references both `dept` and `v`. The enclosing correlation
variables can be carried by the right input, allowing the resulting join to use
an independently decorrelated left input without attaching the outer domain to
it.
The proposed improvement is to avoid this redundant domain propagation for
nested INNER Correlates. The combined domain required to decorrelate the right
input must remain available, and the rewrite must preserve duplicate rows, NULL
correlation keys, and output column mappings. Other join types and left inputs
that reference enclosing correlation variables require their existing treatment.
Generating a smaller equivalent plan reduces unnecessary joins and columns
passed to subsequent optimization, and can reduce the work required to explore
alternative plans. Regression coverage should verify both the simplified plan
structure and result correctness.
This opportunity was identified while investigating
CALCITE-7928([https://issues.apache.org/jira/browse/CALCITE-7928]). As
explained in [PR #5410|#5410]([https://github.com/apache/calcite/pull/5410]),
the original excessive planning time involves join-reordering rules and
`PROJECT_MERGE` generating many duplicate Projects. That PR disables
`PROJECT_MERGE` for the affected test as a workaround; the underlying planner
issue remains separate.
This ticket tracks the decorrelator improvement independently of that planner
issue. [PR #5408|#5408]([https://github.com/apache/calcite/pull/5408]) contains
an initial implementation.
was:
The top-down decorrelator can generate unnecessarily complex plans for nested
LATERAL queries. When a nested INNER Correlate has a left input that does not
reference any enclosing correlation variables, the current implementation still
joins that input with the outer correlation domain. This introduces a redundant
cross join and additional correlation columns into the generated plan.
For example, consider the following query with top-down decorrelation enabled:
```sql
WITH dept (deptno, dname) AS (
VALUES (10, 'ACCOUNTING'), (20, 'RESEARCH')
),
emp (empno, deptno, ename) AS (
VALUES (7369, 20, 'SMITH'),
(7782, 10, 'CLARK'),
(7499, 30, 'ALLEN')
)
SELECT *
FROM dept,
(VALUES 'A', 'M') AS v (v)
CROSS JOIN LATERAL (
SELECT *
FROM emp
WHERE emp.deptno = dept.deptno
AND POSITION(v.v IN emp.ename) > 0
) AS emp;
```
Here, the left input of the nested LATERAL join (`v`) is independent of `dept`,
while its right input references both `dept` and `v`. The enclosing correlation
variables can be carried by the right input, allowing the resulting join to use
an independently decorrelated left input without attaching the outer domain to
it.
The proposed improvement is to avoid this redundant domain propagation for
nested INNER Correlates. The combined domain required to decorrelate the right
input must remain available, and the rewrite must preserve duplicate rows, NULL
correlation keys, and output column mappings. Other join types and left inputs
that reference enclosing correlation variables require their existing treatment.
Generating a smaller equivalent plan reduces unnecessary joins and columns
passed to subsequent optimization, and can reduce the work required to explore
alternative plans. Regression coverage should verify both the simplified plan
structure and result correctness.
This opportunity was identified while investigating
[CALCITE-7928](https://issues.apache.org/jira/browse/CALCITE-7928). As
explained in [PR #5410](https://github.com/apache/calcite/pull/5410), the
original excessive planning time involves join-reordering rules and
`PROJECT_MERGE` generating many duplicate Projects. That PR disables
`PROJECT_MERGE` for the affected test as a workaround; the underlying planner
issue remains separate.
This ticket tracks the decorrelator improvement independently of that planner
issue. [PR #5408](https://github.com/apache/calcite/pull/5408) contains an
initial implementation.
> Top-down decorrelator should avoid redundant domain joins for nested LATERAL
> queries
> ------------------------------------------------------------------------------------
>
> Key: CALCITE-7936
> URL: https://issues.apache.org/jira/browse/CALCITE-7936
> Project: Calcite
> Issue Type: Improvement
> Components: core
> Reporter: Zhen Chen
> Priority: Major
>
> The top-down decorrelator can generate unnecessarily complex plans for nested
> LATERAL queries. When a nested INNER Correlate has a left input that does not
> reference any enclosing correlation variables, the current implementation
> still joins that input with the outer correlation domain. This introduces a
> redundant cross join and additional correlation columns into the generated
> plan.
> For example, consider the following query with top-down decorrelation enabled:
>
> {code:java}
> WITH dept (deptno, dname) AS (
> VALUES (10, 'ACCOUNTING'), (20, 'RESEARCH')
> ),
> emp (empno, deptno, ename) AS (
> VALUES (7369, 20, 'SMITH'),
> (7782, 10, 'CLARK'),
> (7499, 30, 'ALLEN')
> )
> SELECT *
> FROM dept,
> (VALUES 'A', 'M') AS v (v)
> CROSS JOIN LATERAL (
> SELECT *
> FROM emp
> WHERE emp.deptno = dept.deptno
> AND POSITION(v.v IN emp.ename) > 0
> ) AS emp;
> {code}
>
>
> Here, the left input of the nested LATERAL join (`v`) is independent of
> `dept`, while its right input references both `dept` and `v`. The enclosing
> correlation variables can be carried by the right input, allowing the
> resulting join to use an independently decorrelated left input without
> attaching the outer domain to it.
> The proposed improvement is to avoid this redundant domain propagation for
> nested INNER Correlates. The combined domain required to decorrelate the
> right input must remain available, and the rewrite must preserve duplicate
> rows, NULL correlation keys, and output column mappings. Other join types and
> left inputs that reference enclosing correlation variables require their
> existing treatment.
> Generating a smaller equivalent plan reduces unnecessary joins and columns
> passed to subsequent optimization, and can reduce the work required to
> explore alternative plans. Regression coverage should verify both the
> simplified plan structure and result correctness.
> This opportunity was identified while investigating
> CALCITE-7928([https://issues.apache.org/jira/browse/CALCITE-7928]). As
> explained in [PR #5410|#5410]([https://github.com/apache/calcite/pull/5410]),
> the original excessive planning time involves join-reordering rules and
> `PROJECT_MERGE` generating many duplicate Projects. That PR disables
> `PROJECT_MERGE` for the affected test as a workaround; the underlying planner
> issue remains separate.
> This ticket tracks the decorrelator improvement independently of that planner
> issue. [PR #5408|#5408]([https://github.com/apache/calcite/pull/5408])
> contains an initial implementation.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)