Commit b8998c7
perf: Convert inner joins to semi joins when equivalent (#22652)
## Which issue does this PR close?
- Closes #22594
## Rationale for this change
This PR extends the `EliminateJoin` rewrite pass to replace inner joins
with semi joins in some cases. An inner join `L ⋈ R` can be rewritten to
a left semi join `L ⋉ R` if two conditions hold:
1. None of R's columns are referenced above the join
2. (a) each L row matches at most one R row, OR (b) the consumers of the
join result are insensitive to duplicates
(And symmetrically with right semi joins.)
## What changes are included in this PR?
* Add `for_each_referenced_index` helper that is used by both
`EliminateJoin` and `EliminateProjections`
* Introduce `LiveColumns` type to track the "live" (referenced by
parent) columns of a plan node
* Add inner -> semi join rewrite to `EliminateJoin`
* Add unit and SLT tests for rewrite behavior
* Update SLT test fixtures for plan changes
## Are these changes tested?
Yes; new tests added.
## Are there any user-facing changes?
Some plan changes but no behavioral changes.
---------
Co-authored-by: Daniël Heres <danielheres@gmail.com>1 parent 3b321a2 commit b8998c7
14 files changed
Lines changed: 1294 additions & 131 deletions
File tree
- datafusion
- optimizer/src
- optimize_projections
- sqllogictest/test_files
- tpch/plans
Large diffs are not rendered by default.
Lines changed: 4 additions & 24 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
20 | | - | |
| 20 | + | |
| 21 | + | |
21 | 22 | | |
22 | 23 | | |
23 | 24 | | |
| |||
112 | 113 | | |
113 | 114 | | |
114 | 115 | | |
115 | | - | |
116 | | - | |
117 | | - | |
118 | | - | |
119 | | - | |
120 | | - | |
121 | | - | |
122 | | - | |
123 | | - | |
124 | | - | |
125 | | - | |
126 | | - | |
127 | | - | |
128 | | - | |
129 | | - | |
130 | | - | |
131 | | - | |
132 | | - | |
133 | | - | |
134 | | - | |
135 | | - | |
136 | | - | |
137 | | - | |
| 116 | + | |
| 117 | + | |
138 | 118 | | |
139 | 119 | | |
140 | 120 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
27 | | - | |
| 27 | + | |
28 | 28 | | |
29 | 29 | | |
| 30 | + | |
30 | 31 | | |
31 | 32 | | |
32 | 33 | | |
| |||
37 | 38 | | |
38 | 39 | | |
39 | 40 | | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
40 | 91 | | |
41 | 92 | | |
42 | 93 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1333 | 1333 | | |
1334 | 1334 | | |
1335 | 1335 | | |
1336 | | - | |
1337 | | - | |
1338 | | - | |
1339 | | - | |
| 1336 | + | |
| 1337 | + | |
| 1338 | + | |
1340 | 1339 | | |
1341 | 1340 | | |
1342 | 1341 | | |
1343 | 1342 | | |
1344 | | - | |
| 1343 | + | |
1345 | 1344 | | |
1346 | 1345 | | |
1347 | 1346 | | |
1348 | 1347 | | |
| 1348 | + | |
| 1349 | + | |
| 1350 | + | |
| 1351 | + | |
| 1352 | + | |
| 1353 | + | |
| 1354 | + | |
| 1355 | + | |
| 1356 | + | |
| 1357 | + | |
| 1358 | + | |
| 1359 | + | |
| 1360 | + | |
| 1361 | + | |
| 1362 | + | |
| 1363 | + | |
| 1364 | + | |
| 1365 | + | |
| 1366 | + | |
| 1367 | + | |
| 1368 | + | |
| 1369 | + | |
| 1370 | + | |
| 1371 | + | |
| 1372 | + | |
| 1373 | + | |
| 1374 | + | |
| 1375 | + | |
| 1376 | + | |
| 1377 | + | |
| 1378 | + | |
| 1379 | + | |
| 1380 | + | |
| 1381 | + | |
| 1382 | + | |
| 1383 | + | |
| 1384 | + | |
| 1385 | + | |
| 1386 | + | |
1349 | 1387 | | |
1350 | 1388 | | |
1351 | 1389 | | |
| |||
1411 | 1449 | | |
1412 | 1450 | | |
1413 | 1451 | | |
1414 | | - | |
1415 | | - | |
1416 | | - | |
1417 | | - | |
| 1452 | + | |
| 1453 | + | |
| 1454 | + | |
1418 | 1455 | | |
1419 | 1456 | | |
1420 | 1457 | | |
| |||
1423 | 1460 | | |
1424 | 1461 | | |
1425 | 1462 | | |
1426 | | - | |
| 1463 | + | |
1427 | 1464 | | |
1428 | 1465 | | |
1429 | 1466 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
338 | 338 | | |
339 | 339 | | |
340 | 340 | | |
341 | | - | |
| 341 | + | |
342 | 342 | | |
343 | 343 | | |
344 | 344 | | |
345 | 345 | | |
346 | 346 | | |
347 | | - | |
| 347 | + | |
348 | 348 | | |
349 | 349 | | |
350 | 350 | | |
| |||
555 | 555 | | |
556 | 556 | | |
557 | 557 | | |
558 | | - | |
| 558 | + | |
559 | 559 | | |
560 | 560 | | |
561 | 561 | | |
| |||
568 | 568 | | |
569 | 569 | | |
570 | 570 | | |
571 | | - | |
| 571 | + | |
572 | 572 | | |
573 | 573 | | |
574 | 574 | | |
| |||
1675 | 1675 | | |
1676 | 1676 | | |
1677 | 1677 | | |
1678 | | - | |
| 1678 | + | |
1679 | 1679 | | |
1680 | 1680 | | |
1681 | 1681 | | |
| |||
1701 | 1701 | | |
1702 | 1702 | | |
1703 | 1703 | | |
1704 | | - | |
| 1704 | + | |
1705 | 1705 | | |
1706 | 1706 | | |
1707 | 1707 | | |
| |||
1746 | 1746 | | |
1747 | 1747 | | |
1748 | 1748 | | |
1749 | | - | |
| 1749 | + | |
1750 | 1750 | | |
1751 | 1751 | | |
1752 | 1752 | | |
| |||
Lines changed: 4 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
54 | 54 | | |
55 | 55 | | |
56 | 56 | | |
57 | | - | |
| 57 | + | |
58 | 58 | | |
59 | 59 | | |
60 | 60 | | |
| |||
64 | 64 | | |
65 | 65 | | |
66 | 66 | | |
67 | | - | |
| 67 | + | |
68 | 68 | | |
69 | 69 | | |
70 | 70 | | |
| |||
81 | 81 | | |
82 | 82 | | |
83 | 83 | | |
84 | | - | |
| 84 | + | |
85 | 85 | | |
86 | 86 | | |
87 | 87 | | |
| |||
96 | 96 | | |
97 | 97 | | |
98 | 98 | | |
99 | | - | |
| 99 | + | |
100 | 100 | | |
101 | 101 | | |
102 | 102 | | |
| |||
0 commit comments