Skip to content

Commit 2f09641

Browse files
craig[bot]michae2
andcommitted
Merge #150887
150887: sql/opt: improve HoistJoinProjectLeft to hoist more projections r=DrewKimball a=michae2 **sql/opt: improve HoistJoinProjectLeft to hoist more projections** Extend normalization rule `HoistJoinProjectLeft` to hoist projections above joins in more cases. Before this, `HoistJoinProjectLeft` would only hoist projections that were simple column remappings. This change allows hoisting of more projections as long as (a) they are not volatile, (b) they are not referenced by the join filters, and (c) they do not reference input columns. (a) and (b) match the exploration rule `HoistProjectFromInnerJoin`. (c) is a conservative heuristic to avoid hoisting projections when doing so would prevent column pruning. Furthermore, (d) the projections must not be referenced by the right input, which was a pre-existing condition. Fixes: #150704 Release note (sql change): Improve the optimizer to hoist projections above joins in more cases, which can lead to better query plans. This can be enabled by the new session variable `optimizer_use_improved_hoist_join_project`. ---- **sql: enable optimizer_use_improved_hoist_join_project by default** Informs: #150704 Release note: None Co-authored-by: Michael Erickson <[email protected]>
2 parents 776ec87 + ceb7551 commit 2f09641

File tree

19 files changed

+731
-132
lines changed

19 files changed

+731
-132
lines changed

pkg/ccl/logictestccl/testdata/logic_test/regional_by_row_foreign_key

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1803,29 +1803,22 @@ vectorized: true
18031803
│ │ render fk_lookup_crdb_region: fk_lookup_crdb_region
18041804
│ │
18051805
│ └── • render
1806-
│ │ columns: (fk_lookup_crdb_region, k, crdb_region, rowid, k_new)
1806+
│ │ columns: (fk_lookup_crdb_region, k_new, k, crdb_region, rowid)
18071807
│ │ render fk_lookup_crdb_region: CASE WHEN crdb_region IS NOT DISTINCT FROM CAST(NULL AS public.crdb_internal_region) THEN crdb_region ELSE crdb_region END
1808+
│ │ render k_new: 4
18081809
│ │ render k: k
18091810
│ │ render crdb_region: crdb_region
18101811
│ │ render rowid: rowid
1811-
│ │ render k_new: k_new
18121812
│ │
18131813
│ └── • cross join (left outer)
1814-
│ │ columns: (k_new, k, crdb_region, rowid, k, crdb_region)
1814+
│ │ columns: (k, crdb_region, rowid, k, crdb_region)
18151815
│ │ estimated row count: 10 (missing stats)
18161816
│ │
1817-
│ ├── • render
1818-
│ │ │ columns: (k_new, k, crdb_region, rowid)
1819-
│ │ │ render k_new: 4
1820-
│ │ │ render k: k
1821-
│ │ │ render crdb_region: crdb_region
1822-
│ │ │ render rowid: rowid
1823-
│ │ │
1824-
│ │ └── • scan
1825-
│ │ columns: (k, crdb_region, rowid)
1826-
│ │ estimated row count: 10 (missing stats)
1827-
│ │ table: child@child_k_idx
1828-
│ │ spans: /"@"/3-/"@"/4 /"\x80"/3-/"\x80"/4 /"\xc0"/3-/"\xc0"/4
1817+
│ ├── • scan
1818+
│ │ columns: (k, crdb_region, rowid)
1819+
│ │ estimated row count: 10 (missing stats)
1820+
│ │ table: child@child_k_idx
1821+
│ │ spans: /"@"/3-/"@"/4 /"\x80"/3-/"\x80"/4 /"\xc0"/3-/"\xc0"/4
18291822
│ │
18301823
│ └── • union all
18311824
│ │ columns: (k, crdb_region)

pkg/ccl/logictestccl/testdata/logic_test/regional_by_row_query_behavior

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,10 +1746,8 @@ VALUES ('us-east-1', 23, 24, 25, 26), ('ca-central-1', 30, 30, 31, 32)] OFFSET 2
17461746
│ │ remote lookup condition: (crdb_region IN ('ca-central-1', 'us-east-1')) AND (column2 = pk)
17471747
│ │ locking strength: for update
17481748
│ │
1749-
│ └── • render
1750-
│ │
1751-
│ └── • values
1752-
│ size: 5 columns, 2 rows
1749+
│ └── • values
1750+
│ size: 5 columns, 2 rows
17531751
17541752
├── • constraint-check
17551753
│ │

pkg/sql/exec_util.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4388,6 +4388,10 @@ func (m *sessionDataMutator) SetAllowUnsafeInternals(val bool) {
43884388
m.data.AllowUnsafeInternals = val
43894389
}
43904390

4391+
func (m *sessionDataMutator) SetOptimizerUseImprovedHoistJoinProject(val bool) {
4392+
m.data.OptimizerUseImprovedHoistJoinProject = val
4393+
}
4394+
43914395
// Utility functions related to scrubbing sensitive information on SQL Stats.
43924396

43934397
// quantizeCounts ensures that the Count field in the

pkg/sql/logictest/testdata/logic_test/information_schema

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4083,6 +4083,7 @@ optimizer_use_histograms on
40834083
optimizer_use_improved_computed_column_filters_derivation on
40844084
optimizer_use_improved_disjunction_stats on
40854085
optimizer_use_improved_distinct_on_limit_hint_costing on
4086+
optimizer_use_improved_hoist_join_project on
40864087
optimizer_use_improved_join_elimination on
40874088
optimizer_use_improved_multi_column_selectivity_estimate on
40884089
optimizer_use_improved_split_disjunction_for_joins on

pkg/sql/logictest/testdata/logic_test/pg_catalog

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3095,6 +3095,7 @@ optimizer_use_histograms on
30953095
optimizer_use_improved_computed_column_filters_derivation on NULL NULL NULL string
30963096
optimizer_use_improved_disjunction_stats on NULL NULL NULL string
30973097
optimizer_use_improved_distinct_on_limit_hint_costing on NULL NULL NULL string
3098+
optimizer_use_improved_hoist_join_project on NULL NULL NULL string
30983099
optimizer_use_improved_join_elimination on NULL NULL NULL string
30993100
optimizer_use_improved_multi_column_selectivity_estimate on NULL NULL NULL string
31003101
optimizer_use_improved_split_disjunction_for_joins on NULL NULL NULL string
@@ -3338,6 +3339,7 @@ optimizer_use_histograms on
33383339
optimizer_use_improved_computed_column_filters_derivation on NULL user NULL on on
33393340
optimizer_use_improved_disjunction_stats on NULL user NULL on on
33403341
optimizer_use_improved_distinct_on_limit_hint_costing on NULL user NULL on on
3342+
optimizer_use_improved_hoist_join_project on NULL user NULL on on
33413343
optimizer_use_improved_join_elimination on NULL user NULL on on
33423344
optimizer_use_improved_multi_column_selectivity_estimate on NULL user NULL on on
33433345
optimizer_use_improved_split_disjunction_for_joins on NULL user NULL on on
@@ -3572,6 +3574,7 @@ optimizer_use_histograms NULL NULL
35723574
optimizer_use_improved_computed_column_filters_derivation NULL NULL NULL NULL NULL
35733575
optimizer_use_improved_disjunction_stats NULL NULL NULL NULL NULL
35743576
optimizer_use_improved_distinct_on_limit_hint_costing NULL NULL NULL NULL NULL
3577+
optimizer_use_improved_hoist_join_project NULL NULL NULL NULL NULL
35753578
optimizer_use_improved_join_elimination NULL NULL NULL NULL NULL
35763579
optimizer_use_improved_multi_column_selectivity_estimate NULL NULL NULL NULL NULL
35773580
optimizer_use_improved_split_disjunction_for_joins NULL NULL NULL NULL NULL

pkg/sql/logictest/testdata/logic_test/show_source

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ optimizer_use_histograms on
172172
optimizer_use_improved_computed_column_filters_derivation on
173173
optimizer_use_improved_disjunction_stats on
174174
optimizer_use_improved_distinct_on_limit_hint_costing on
175+
optimizer_use_improved_hoist_join_project on
175176
optimizer_use_improved_join_elimination on
176177
optimizer_use_improved_multi_column_selectivity_estimate on
177178
optimizer_use_improved_split_disjunction_for_joins on

pkg/sql/opt/exec/execbuilder/testdata/inverted_join_multi_column

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,17 @@ vectorized: true
6868
└── • inverted join
6969
│ table: j2@isj_idx
7070
71-
└── • cross join
72-
73-
├── • render
74-
│ │
75-
│ └── • scan
76-
│ missing stats
77-
│ table: j1@j1_pkey
78-
│ spans: FULL SCAN
71+
└── • render
7972
80-
└── • values
81-
size: 1 column, 2 rows
73+
└── • cross join
74+
75+
├── • scan
76+
│ missing stats
77+
│ table: j1@j1_pkey
78+
│ spans: FULL SCAN
79+
80+
└── • values
81+
size: 1 column, 2 rows
8282

8383
query T
8484
EXPLAIN SELECT j1.k
@@ -124,14 +124,14 @@ vectorized: true
124124
└── • inverted join
125125
│ table: j2@isj_idx
126126
127-
└── • cross join
128-
129-
├── • render
130-
│ │
131-
│ └── • scan
132-
│ missing stats
133-
│ table: j1@j1_pkey
134-
│ spans: FULL SCAN
127+
└── • render
135128
136-
└── • values
137-
size: 1 column, 2 rows
129+
└── • cross join
130+
131+
├── • scan
132+
│ missing stats
133+
│ table: j1@j1_pkey
134+
│ spans: FULL SCAN
135+
136+
└── • values
137+
size: 1 column, 2 rows

pkg/sql/opt/exec/execbuilder/testdata/unique

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3628,10 +3628,8 @@ vectorized: true
36283628
│ │ equality cols are key
36293629
│ │ locking strength: for update
36303630
│ │
3631-
│ └── • render
3632-
│ │
3633-
│ └── • values
3634-
│ size: 3 columns, 2 rows
3631+
│ └── • values
3632+
│ size: 3 columns, 2 rows
36353633
36363634
├── • constraint-check
36373635
│ │
@@ -3690,10 +3688,8 @@ vectorized: true
36903688
│ │ equality cols are key
36913689
│ │ locking strength: for update
36923690
│ │
3693-
│ └── • render
3694-
│ │
3695-
│ └── • values
3696-
│ size: 3 columns, 2 rows
3691+
│ └── • values
3692+
│ size: 3 columns, 2 rows
36973693
36983694
├── • constraint-check
36993695
│ │
@@ -3753,10 +3749,8 @@ vectorized: true
37533749
│ │ equality cols are key
37543750
│ │ locking strength: for update
37553751
│ │
3756-
│ └── • render
3757-
│ │
3758-
│ └── • values
3759-
│ size: 2 columns, 2 rows
3752+
│ └── • values
3753+
│ size: 2 columns, 2 rows
37603754
37613755
├── • constraint-check
37623756
│ │
@@ -3891,10 +3885,8 @@ vectorized: true
38913885
│ │ table: uniq@uniq_pkey
38923886
│ │ spans: FULL SCAN
38933887
│ │
3894-
│ └── • render
3895-
│ │
3896-
│ └── • values
3897-
│ size: 3 columns, 2 rows
3888+
│ └── • values
3889+
│ size: 3 columns, 2 rows
38983890
38993891
├── • constraint-check
39003892
│ │
@@ -4574,10 +4566,8 @@ vectorized: true
45744566
│ │ equality cols are key
45754567
│ │ locking strength: for update
45764568
│ │
4577-
│ └── • render
4578-
│ │
4579-
│ └── • values
4580-
│ size: 2 columns, 2 rows
4569+
│ └── • values
4570+
│ size: 2 columns, 2 rows
45814571
45824572
├── • constraint-check
45834573
│ │

pkg/sql/opt/exec/execbuilder/testdata/upsert

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ vectorized: true
106106
107107
└── • render
108108
│ columns: (k, v_default, k)
109-
│ render k: k
110109
│ render v_default: CAST(NULL AS INT8)
111110
│ render k: k
111+
│ render k: k
112112
113113
└── • top-k
114114
│ columns: (k, v)

pkg/sql/opt/memo/memo.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ type Memo struct {
210210
usePre_25_2VariadicBuiltins bool
211211
useExistsFilterHoistRule bool
212212
disableSlowCascadeFastPathForRBRTables bool
213+
useImprovedHoistJoinProject bool
213214

214215
// txnIsoLevel is the isolation level under which the plan was created. This
215216
// affects the planning of some locking operations, so it must be included in
@@ -316,6 +317,7 @@ func (m *Memo) Init(ctx context.Context, evalCtx *eval.Context) {
316317
usePre_25_2VariadicBuiltins: evalCtx.SessionData().UsePre_25_2VariadicBuiltins,
317318
useExistsFilterHoistRule: evalCtx.SessionData().OptimizerUseExistsFilterHoistRule,
318319
disableSlowCascadeFastPathForRBRTables: evalCtx.SessionData().OptimizerDisableCrossRegionCascadeFastPathForRBRTables,
320+
useImprovedHoistJoinProject: evalCtx.SessionData().OptimizerUseImprovedHoistJoinProject,
319321
txnIsoLevel: evalCtx.TxnIsoLevel,
320322
}
321323
m.metadata.Init()
@@ -490,6 +492,7 @@ func (m *Memo) IsStale(
490492
m.usePre_25_2VariadicBuiltins != evalCtx.SessionData().UsePre_25_2VariadicBuiltins ||
491493
m.useExistsFilterHoistRule != evalCtx.SessionData().OptimizerUseExistsFilterHoistRule ||
492494
m.disableSlowCascadeFastPathForRBRTables != evalCtx.SessionData().OptimizerDisableCrossRegionCascadeFastPathForRBRTables ||
495+
m.useImprovedHoistJoinProject != evalCtx.SessionData().OptimizerUseImprovedHoistJoinProject ||
493496
m.txnIsoLevel != evalCtx.TxnIsoLevel {
494497
return true, nil
495498
}

0 commit comments

Comments
 (0)