Skip to content

Commit 8be550a

Browse files
authored
Merge pull request #156788 from mgartner/backport25.4-156654
release-25.4: sql: add optimizer_use_max_frequency_selectivity session setting
2 parents 5c3e649 + c9ed1b6 commit 8be550a

File tree

10 files changed

+62
-0
lines changed

10 files changed

+62
-0
lines changed

pkg/sql/exec_util.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4479,6 +4479,10 @@ func (m *sessionDataMutator) SetOptimizerClampInequalitySelectivity(val bool) {
44794479
m.data.OptimizerClampInequalitySelectivity = val
44804480
}
44814481

4482+
func (m *sessionDataMutator) SetOptimizerUseMaxFrequencySelectivity(val bool) {
4483+
m.data.OptimizerUseMaxFrequencySelectivity = val
4484+
}
4485+
44824486
// Utility functions related to scrubbing sensitive information on SQL Stats.
44834487

44844488
// 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
@@ -4218,6 +4218,7 @@ optimizer_use_improved_zigzag_join_costing on
42184218
optimizer_use_limit_ordering_for_streaming_group_by on
42194219
optimizer_use_lock_elision_multiple_families off
42204220
optimizer_use_lock_op_for_serializable off
4221+
optimizer_use_max_frequency_selectivity on
42214222
optimizer_use_merged_partial_statistics on
42224223
optimizer_use_multicol_stats on
42234224
optimizer_use_not_visible_indexes off

pkg/sql/logictest/testdata/logic_test/pg_catalog

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3120,6 +3120,7 @@ optimizer_use_improved_zigzag_join_costing on
31203120
optimizer_use_limit_ordering_for_streaming_group_by on NULL NULL NULL string
31213121
optimizer_use_lock_elision_multiple_families off NULL NULL NULL string
31223122
optimizer_use_lock_op_for_serializable off NULL NULL NULL string
3123+
optimizer_use_max_frequency_selectivity on NULL NULL NULL string
31233124
optimizer_use_merged_partial_statistics on NULL NULL NULL string
31243125
optimizer_use_multicol_stats on NULL NULL NULL string
31253126
optimizer_use_not_visible_indexes off NULL NULL NULL string
@@ -3367,6 +3368,7 @@ optimizer_use_improved_zigzag_join_costing on
33673368
optimizer_use_limit_ordering_for_streaming_group_by on NULL user NULL on on
33683369
optimizer_use_lock_elision_multiple_families off NULL user NULL off off
33693370
optimizer_use_lock_op_for_serializable off NULL user NULL off off
3371+
optimizer_use_max_frequency_selectivity on NULL user NULL on on
33703372
optimizer_use_merged_partial_statistics on NULL user NULL on on
33713373
optimizer_use_multicol_stats on NULL user NULL on on
33723374
optimizer_use_not_visible_indexes off NULL user NULL off off
@@ -3605,6 +3607,7 @@ optimizer_use_improved_zigzag_join_costing NULL NULL
36053607
optimizer_use_limit_ordering_for_streaming_group_by NULL NULL NULL NULL NULL
36063608
optimizer_use_lock_elision_multiple_families NULL NULL NULL NULL NULL
36073609
optimizer_use_lock_op_for_serializable NULL NULL NULL NULL NULL
3610+
optimizer_use_max_frequency_selectivity NULL NULL NULL NULL NULL
36083611
optimizer_use_merged_partial_statistics NULL NULL NULL NULL NULL
36093612
optimizer_use_multicol_stats NULL NULL NULL NULL NULL
36103613
optimizer_use_not_visible_indexes 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
@@ -184,6 +184,7 @@ optimizer_use_improved_zigzag_join_costing on
184184
optimizer_use_limit_ordering_for_streaming_group_by on
185185
optimizer_use_lock_elision_multiple_families off
186186
optimizer_use_lock_op_for_serializable off
187+
optimizer_use_max_frequency_selectivity on
187188
optimizer_use_merged_partial_statistics on
188189
optimizer_use_multicol_stats on
189190
optimizer_use_not_visible_indexes off

pkg/sql/opt/memo/memo.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ type Memo struct {
213213
useImprovedHoistJoinProject bool
214214
clampLowHistogramSelectivity bool
215215
clampInequalitySelectivity bool
216+
useMaxFrequencySelectivity bool
216217

217218
// txnIsoLevel is the isolation level under which the plan was created. This
218219
// affects the planning of some locking operations, so it must be included in
@@ -326,6 +327,7 @@ func (m *Memo) Init(ctx context.Context, evalCtx *eval.Context) {
326327
useImprovedHoistJoinProject: evalCtx.SessionData().OptimizerUseImprovedHoistJoinProject,
327328
clampLowHistogramSelectivity: evalCtx.SessionData().OptimizerClampLowHistogramSelectivity,
328329
clampInequalitySelectivity: evalCtx.SessionData().OptimizerClampInequalitySelectivity,
330+
useMaxFrequencySelectivity: evalCtx.SessionData().OptimizerUseMaxFrequencySelectivity,
329331
txnIsoLevel: evalCtx.TxnIsoLevel,
330332
}
331333
m.metadata.Init()
@@ -503,6 +505,7 @@ func (m *Memo) IsStale(
503505
m.useImprovedHoistJoinProject != evalCtx.SessionData().OptimizerUseImprovedHoistJoinProject ||
504506
m.clampLowHistogramSelectivity != evalCtx.SessionData().OptimizerClampLowHistogramSelectivity ||
505507
m.clampInequalitySelectivity != evalCtx.SessionData().OptimizerClampInequalitySelectivity ||
508+
m.useMaxFrequencySelectivity != evalCtx.SessionData().OptimizerUseMaxFrequencySelectivity ||
506509
m.txnIsoLevel != evalCtx.TxnIsoLevel {
507510
return true, nil
508511
}

pkg/sql/opt/memo/memo_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,12 @@ func TestMemoIsStale(t *testing.T) {
510510
evalCtx.SessionData().OptimizerUseImprovedMultiColumnSelectivityEstimate = false
511511
notStale()
512512

513+
// Stale optimizer_use_max_frequency_selectivity.
514+
evalCtx.SessionData().OptimizerUseMaxFrequencySelectivity = true
515+
stale()
516+
evalCtx.SessionData().OptimizerUseMaxFrequencySelectivity = false
517+
notStale()
518+
513519
// Stale optimizer_prove_implication_with_virtual_computed_columns.
514520
evalCtx.SessionData().OptimizerProveImplicationWithVirtualComputedColumns = true
515521
stale()

pkg/sql/opt/memo/statistics_builder.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4670,6 +4670,9 @@ func (sb *statisticsBuilder) selectivityFromMaxFrequencies(
46704670
) (selectivity, selectivityUpperBound props.Selectivity, maxFreqCols opt.ColSet) {
46714671
selectivity = props.OneSelectivity
46724672
selectivityUpperBound = props.OneSelectivity
4673+
if !sb.evalCtx.SessionData().OptimizerUseMaxFrequencySelectivity {
4674+
return selectivity, selectivityUpperBound, opt.ColSet{}
4675+
}
46734676
for col, ok := cols.Next(0); ok; col, ok = cols.Next(col + 1) {
46744677
c := opt.MakeColSet(col)
46754678
inputColStat, inputStats := sb.colStatFromInput(c, e)

pkg/sql/opt/memo/testdata/stats/generic

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,27 @@ select
254254
└── filters
255255
└── i:2 = $1 [type=bool, outer=(2), constraints=(/2: (/NULL - ]), fd=()-->(2)]
256256

257+
# Fallback to ~row_count/distinct_count if
258+
# optimizer_use_max_frequency_selectivity is false.
259+
norm set=(optimizer_use_max_frequency_selectivity=false)
260+
SELECT * FROM t WHERE i = $1
261+
----
262+
select
263+
├── columns: k:1(int!null) i:2(int!null) s:3(string)
264+
├── has-placeholder
265+
├── stats: [rows=24.25, distinct(2)=1, null(2)=0]
266+
├── key: (1)
267+
├── fd: ()-->(2), (1)-->(3)
268+
├── scan t
269+
│ ├── columns: k:1(int!null) i:2(int) s:3(string)
270+
│ ├── stats: [rows=1000, distinct(1)=1000, null(1)=0, distinct(2)=41, null(2)=30]
271+
│ │ histogram(2)= 0 30 0 0 90 10 180 10 270 20 360 30
272+
│ │ <--- NULL --- 0 ---- 100 ----- 200 ----- 300 ----- 400
273+
│ ├── key: (1)
274+
│ └── fd: (1)-->(2,3)
275+
└── filters
276+
└── i:2 = $1 [type=bool, outer=(2), constraints=(/2: (/NULL - ]), fd=()-->(2)]
277+
257278
# Similar case as above, but with opt to ensure the correct row counts are used
258279
# for new memo groups.
259280
opt

pkg/sql/sessiondatapb/local_only_session_data.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -749,6 +749,9 @@ message LocalOnlySessionData {
749749
// clamp the selectivity of open-ended inequality filters (e.g. <, >, !=)
750750
// but not (=, BETWEEN etc.) to a minimum threshold.
751751
bool optimizer_clamp_inequality_selectivity = 190;
752+
// OptimizerUseMaxFrequencySelectivity, when true, indicates that the
753+
// optimizer should use max frequency for selectivity estimation.
754+
bool optimizer_use_max_frequency_selectivity = 191;
752755

753756
///////////////////////////////////////////////////////////////////////////
754757
// WARNING: consider whether a session parameter you're adding needs to //

pkg/sql/vars.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3723,6 +3723,23 @@ var varGen = map[string]sessionVar{
37233723
GlobalDefault: globalTrue,
37243724
},
37253725

3726+
// CockroachDB extension.
3727+
`optimizer_use_max_frequency_selectivity`: {
3728+
GetStringVal: makePostgresBoolGetStringValFn(`optimizer_use_max_frequency_selectivity`),
3729+
Set: func(_ context.Context, m sessionDataMutator, s string) error {
3730+
b, err := paramparse.ParseBoolVar("optimizer_use_max_frequency_selectivity", s)
3731+
if err != nil {
3732+
return err
3733+
}
3734+
m.SetOptimizerUseMaxFrequencySelectivity(b)
3735+
return nil
3736+
},
3737+
Get: func(evalCtx *extendedEvalContext, _ *kv.Txn) (string, error) {
3738+
return formatBoolAsPostgresSetting(evalCtx.SessionData().OptimizerUseMaxFrequencySelectivity), nil
3739+
},
3740+
GlobalDefault: globalTrue,
3741+
},
3742+
37263743
// CockroachDB extension.
37273744
`optimizer_prove_implication_with_virtual_computed_columns`: {
37283745
GetStringVal: makePostgresBoolGetStringValFn(`optimizer_prove_implication_with_virtual_computed_columns`),

0 commit comments

Comments
 (0)