Skip to content

Commit 418521e

Browse files
committed
sql: add optimizer_use_max_frequency_selectivity session setting
The `optimizer_use_max_frequency_selectivity` session setting has been added. It is enabled by default. Disabling it reverts the selectivity improvements added in #151409. Release note: None
1 parent 099efb8 commit 418521e

File tree

10 files changed

+62
-0
lines changed

10 files changed

+62
-0
lines changed

pkg/sql/logictest/testdata/logic_test/information_schema

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4217,6 +4217,7 @@ optimizer_use_improved_zigzag_join_costing on
42174217
optimizer_use_limit_ordering_for_streaming_group_by on
42184218
optimizer_use_lock_elision_multiple_families off
42194219
optimizer_use_lock_op_for_serializable off
4220+
optimizer_use_max_frequency_selectivity on
42204221
optimizer_use_merged_partial_statistics on
42214222
optimizer_use_multicol_stats on
42224223
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
@@ -3166,6 +3166,7 @@ optimizer_use_improved_zigzag_join_costing on
31663166
optimizer_use_limit_ordering_for_streaming_group_by on NULL NULL NULL string
31673167
optimizer_use_lock_elision_multiple_families off NULL NULL NULL string
31683168
optimizer_use_lock_op_for_serializable off NULL NULL NULL string
3169+
optimizer_use_max_frequency_selectivity on NULL NULL NULL string
31693170
optimizer_use_merged_partial_statistics on NULL NULL NULL string
31703171
optimizer_use_multicol_stats on NULL NULL NULL string
31713172
optimizer_use_not_visible_indexes off NULL NULL NULL string
@@ -3412,6 +3413,7 @@ optimizer_use_improved_zigzag_join_costing on
34123413
optimizer_use_limit_ordering_for_streaming_group_by on NULL user NULL on on
34133414
optimizer_use_lock_elision_multiple_families off NULL user NULL off off
34143415
optimizer_use_lock_op_for_serializable off NULL user NULL off off
3416+
optimizer_use_max_frequency_selectivity on NULL user NULL on on
34153417
optimizer_use_merged_partial_statistics on NULL user NULL on on
34163418
optimizer_use_multicol_stats on NULL user NULL on on
34173419
optimizer_use_not_visible_indexes off NULL user NULL off off
@@ -3649,6 +3651,7 @@ optimizer_use_improved_zigzag_join_costing NULL NULL
36493651
optimizer_use_limit_ordering_for_streaming_group_by NULL NULL NULL NULL NULL
36503652
optimizer_use_lock_elision_multiple_families NULL NULL NULL NULL NULL
36513653
optimizer_use_lock_op_for_serializable NULL NULL NULL NULL NULL
3654+
optimizer_use_max_frequency_selectivity NULL NULL NULL NULL NULL
36523655
optimizer_use_merged_partial_statistics NULL NULL NULL NULL NULL
36533656
optimizer_use_multicol_stats NULL NULL NULL NULL NULL
36543657
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
@@ -183,6 +183,7 @@ optimizer_use_improved_zigzag_join_costing on
183183
optimizer_use_limit_ordering_for_streaming_group_by on
184184
optimizer_use_lock_elision_multiple_families off
185185
optimizer_use_lock_op_for_serializable off
186+
optimizer_use_max_frequency_selectivity on
186187
optimizer_use_merged_partial_statistics on
187188
optimizer_use_multicol_stats on
188189
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
@@ -214,6 +214,7 @@ type Memo struct {
214214
rowSecurity bool
215215
clampLowHistogramSelectivity bool
216216
clampInequalitySelectivity bool
217+
useMaxFrequencySelectivity bool
217218

218219
// txnIsoLevel is the isolation level under which the plan was created. This
219220
// affects the planning of some locking operations, so it must be included in
@@ -328,6 +329,7 @@ func (m *Memo) Init(ctx context.Context, evalCtx *eval.Context) {
328329
rowSecurity: evalCtx.SessionData().RowSecurity,
329330
clampLowHistogramSelectivity: evalCtx.SessionData().OptimizerClampLowHistogramSelectivity,
330331
clampInequalitySelectivity: evalCtx.SessionData().OptimizerClampInequalitySelectivity,
332+
useMaxFrequencySelectivity: evalCtx.SessionData().OptimizerUseMaxFrequencySelectivity,
331333
txnIsoLevel: evalCtx.TxnIsoLevel,
332334
}
333335
m.metadata.Init()
@@ -506,6 +508,7 @@ func (m *Memo) IsStale(
506508
m.rowSecurity != evalCtx.SessionData().RowSecurity ||
507509
m.clampLowHistogramSelectivity != evalCtx.SessionData().OptimizerClampLowHistogramSelectivity ||
508510
m.clampInequalitySelectivity != evalCtx.SessionData().OptimizerClampInequalitySelectivity ||
511+
m.useMaxFrequencySelectivity != evalCtx.SessionData().OptimizerUseMaxFrequencySelectivity ||
509512
m.txnIsoLevel != evalCtx.TxnIsoLevel {
510513
return true, nil
511514
}

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/sessionmutator/mutator.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,3 +1098,7 @@ func (m *SessionDataMutator) SetOptimizerClampLowHistogramSelectivity(val bool)
10981098
func (m *SessionDataMutator) SetOptimizerClampInequalitySelectivity(val bool) {
10991099
m.Data.OptimizerClampInequalitySelectivity = val
11001100
}
1101+
1102+
func (m *SessionDataMutator) SetOptimizerUseMaxFrequencySelectivity(val bool) {
1103+
m.Data.OptimizerUseMaxFrequencySelectivity = val
1104+
}

pkg/sql/vars.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3729,6 +3729,23 @@ var varGen = map[string]sessionVar{
37293729
GlobalDefault: globalTrue,
37303730
},
37313731

3732+
// CockroachDB extension.
3733+
`optimizer_use_max_frequency_selectivity`: {
3734+
GetStringVal: makePostgresBoolGetStringValFn(`optimizer_use_max_frequency_selectivity`),
3735+
Set: func(_ context.Context, m sessionmutator.SessionDataMutator, s string) error {
3736+
b, err := paramparse.ParseBoolVar("optimizer_use_max_frequency_selectivity", s)
3737+
if err != nil {
3738+
return err
3739+
}
3740+
m.SetOptimizerUseMaxFrequencySelectivity(b)
3741+
return nil
3742+
},
3743+
Get: func(evalCtx *extendedEvalContext, _ *kv.Txn) (string, error) {
3744+
return formatBoolAsPostgresSetting(evalCtx.SessionData().OptimizerUseMaxFrequencySelectivity), nil
3745+
},
3746+
GlobalDefault: globalTrue,
3747+
},
3748+
37323749
// CockroachDB extension.
37333750
`optimizer_prove_implication_with_virtual_computed_columns`: {
37343751
GetStringVal: makePostgresBoolGetStringValFn(`optimizer_prove_implication_with_virtual_computed_columns`),

0 commit comments

Comments
 (0)