Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

opt: add optimizer_min_row_count session setting #140065

Merged
merged 1 commit into from
Jan 31, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions pkg/sql/exec_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -4008,6 +4008,10 @@ func (m *sessionDataMutator) SetOptimizerPreferBoundedCardinality(b bool) {
m.data.OptimizerPreferBoundedCardinality = b
}

func (m *sessionDataMutator) SetOptimizerMinRowCount(val float64) {
m.data.OptimizerMinRowCount = val
}

// Utility functions related to scrubbing sensitive information on SQL Stats.

// quantizeCounts ensures that the Count field in the
Expand Down
1 change: 1 addition & 0 deletions pkg/sql/logictest/testdata/logic_test/information_schema
Original file line number Diff line number Diff line change
Expand Up @@ -4007,6 +4007,7 @@ optimizer on
optimizer_always_use_histograms on
optimizer_hoist_uncorrelated_equality_subqueries on
optimizer_merge_joins_enabled on
optimizer_min_row_count 0
optimizer_prefer_bounded_cardinality off
optimizer_prove_implication_with_virtual_computed_columns on
optimizer_push_limit_into_project_filtered_scan on
Expand Down
3 changes: 3 additions & 0 deletions pkg/sql/logictest/testdata/logic_test/pg_catalog
Original file line number Diff line number Diff line change
Expand Up @@ -3007,6 +3007,7 @@ opt_split_scan_limit 2048 N
optimizer_always_use_histograms on NULL NULL NULL string
optimizer_hoist_uncorrelated_equality_subqueries on NULL NULL NULL string
optimizer_merge_joins_enabled on NULL NULL NULL string
optimizer_min_row_count 0 NULL NULL NULL string
optimizer_prefer_bounded_cardinality off NULL NULL NULL string
optimizer_prove_implication_with_virtual_computed_columns on NULL NULL NULL string
optimizer_push_limit_into_project_filtered_scan on NULL NULL NULL string
Expand Down Expand Up @@ -3213,6 +3214,7 @@ opt_split_scan_limit 2048 N
optimizer_always_use_histograms on NULL user NULL on on
optimizer_hoist_uncorrelated_equality_subqueries on NULL user NULL on on
optimizer_merge_joins_enabled on NULL user NULL on on
optimizer_min_row_count 0 NULL user NULL 0 0
optimizer_prefer_bounded_cardinality off NULL user NULL off off
optimizer_prove_implication_with_virtual_computed_columns on NULL user NULL on on
optimizer_push_limit_into_project_filtered_scan on NULL user NULL on on
Expand Down Expand Up @@ -3418,6 +3420,7 @@ optimizer NULL NULL NULL
optimizer_always_use_histograms NULL NULL NULL NULL NULL
optimizer_hoist_uncorrelated_equality_subqueries NULL NULL NULL NULL NULL
optimizer_merge_joins_enabled NULL NULL NULL NULL NULL
optimizer_min_row_count NULL NULL NULL NULL NULL
optimizer_prefer_bounded_cardinality NULL NULL NULL NULL NULL
optimizer_prove_implication_with_virtual_computed_columns NULL NULL NULL NULL NULL
optimizer_push_limit_into_project_filtered_scan NULL NULL NULL NULL NULL
Expand Down
1 change: 1 addition & 0 deletions pkg/sql/logictest/testdata/logic_test/show_source
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ opt_split_scan_limit 2048
optimizer_always_use_histograms on
optimizer_hoist_uncorrelated_equality_subqueries on
optimizer_merge_joins_enabled on
optimizer_min_row_count 0
optimizer_prefer_bounded_cardinality off
optimizer_prove_implication_with_virtual_computed_columns on
optimizer_push_limit_into_project_filtered_scan on
Expand Down
10 changes: 5 additions & 5 deletions pkg/sql/opt/exec/execbuilder/testdata/explain_redact
Original file line number Diff line number Diff line change
Expand Up @@ -678,7 +678,7 @@ upsert bc
query T
EXPLAIN (OPT, MEMO, REDACT) INSERT INTO bc SELECT a::float + 1 FROM a ON CONFLICT (b) DO UPDATE SET b = bc.b + 100
----
memo (optimized, ~36KB, required=[presentation: info:25] [distribution: test])
memo (optimized, ~37KB, required=[presentation: info:25] [distribution: test])
├── G1: (explain G2 [distribution: test])
│ └── [presentation: info:25] [distribution: test]
│ ├── best: (explain G2="[distribution: test]" [distribution: test])
Expand Down Expand Up @@ -1117,7 +1117,7 @@ update ab
query T
EXPLAIN (OPT, MEMO, REDACT) UPDATE ab SET a = a || 'ab' WHERE a > 'a'
----
memo (optimized, ~14KB, required=[presentation: info:15] [distribution: test])
memo (optimized, ~15KB, required=[presentation: info:15] [distribution: test])
├── G1: (explain G2 [distribution: test])
│ └── [presentation: info:15] [distribution: test]
│ ├── best: (explain G2="[distribution: test]" [distribution: test])
Expand Down Expand Up @@ -1355,7 +1355,7 @@ update e
query T
EXPLAIN (OPT, MEMO, REDACT) UPDATE e SET e = 'eee' WHERE e > 'a'
----
memo (optimized, ~17KB, required=[presentation: info:17] [distribution: test])
memo (optimized, ~18KB, required=[presentation: info:17] [distribution: test])
├── G1: (explain G2 [distribution: test])
│ └── [presentation: info:17] [distribution: test]
│ ├── best: (explain G2="[distribution: test]" [distribution: test])
Expand Down Expand Up @@ -1686,7 +1686,7 @@ project
query T
EXPLAIN (OPT, MEMO, REDACT) SELECT * FROM bc WHERE b >= 1.0 AND b < 2.0
----
memo (optimized, ~12KB, required=[presentation: info:7] [distribution: test])
memo (optimized, ~13KB, required=[presentation: info:7] [distribution: test])
├── G1: (explain G2 [presentation: b:1,c:2] [distribution: test])
│ └── [presentation: info:7] [distribution: test]
│ ├── best: (explain G2="[presentation: b:1,c:2] [distribution: test]" [presentation: b:1,c:2] [distribution: test])
Expand Down Expand Up @@ -2435,7 +2435,7 @@ project
query T
EXPLAIN (OPT, MEMO, REDACT) SELECT * FROM bc JOIN f ON b = f + 1
----
memo (optimized, ~28KB, required=[presentation: info:14] [distribution: test])
memo (optimized, ~29KB, required=[presentation: info:14] [distribution: test])
├── G1: (explain G2 [presentation: b:1,c:2,f:7] [distribution: test])
│ └── [presentation: info:14] [distribution: test]
│ ├── best: (explain G2="[presentation: b:1,c:2,f:7] [distribution: test]" [presentation: b:1,c:2,f:7] [distribution: test])
Expand Down
3 changes: 3 additions & 0 deletions pkg/sql/opt/memo/memo.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ type Memo struct {
unsafeAllowTriggersModifyingCascades bool
legacyVarcharTyping bool
preferBoundedCardinality bool
minRowCount float64
internal bool

// txnIsoLevel is the isolation level under which the plan was created. This
Expand Down Expand Up @@ -295,6 +296,7 @@ func (m *Memo) Init(ctx context.Context, evalCtx *eval.Context) {
unsafeAllowTriggersModifyingCascades: evalCtx.SessionData().UnsafeAllowTriggersModifyingCascades,
legacyVarcharTyping: evalCtx.SessionData().LegacyVarcharTyping,
preferBoundedCardinality: evalCtx.SessionData().OptimizerPreferBoundedCardinality,
minRowCount: evalCtx.SessionData().OptimizerMinRowCount,
internal: evalCtx.SessionData().Internal,
txnIsoLevel: evalCtx.TxnIsoLevel,
}
Expand Down Expand Up @@ -466,6 +468,7 @@ func (m *Memo) IsStale(
m.unsafeAllowTriggersModifyingCascades != evalCtx.SessionData().UnsafeAllowTriggersModifyingCascades ||
m.legacyVarcharTyping != evalCtx.SessionData().LegacyVarcharTyping ||
m.preferBoundedCardinality != evalCtx.SessionData().OptimizerPreferBoundedCardinality ||
m.minRowCount != evalCtx.SessionData().OptimizerMinRowCount ||
m.internal != evalCtx.SessionData().Internal ||
m.txnIsoLevel != evalCtx.TxnIsoLevel {
return true, nil
Expand Down
5 changes: 5 additions & 0 deletions pkg/sql/opt/memo/memo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -543,6 +543,11 @@ func TestMemoIsStale(t *testing.T) {
evalCtx.SessionData().OptimizerPreferBoundedCardinality = false
notStale()

evalCtx.SessionData().OptimizerMinRowCount = 1.0
stale()
evalCtx.SessionData().OptimizerMinRowCount = 0
notStale()

evalCtx.SessionData().Internal = true
stale()
evalCtx.SessionData().Internal = false
Expand Down
62 changes: 32 additions & 30 deletions pkg/sql/opt/memo/statistics_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -229,18 +229,20 @@ const (
//
// See props/statistics.go for more details.
type statisticsBuilder struct {
ctx context.Context
evalCtx *eval.Context
md *opt.Metadata
ctx context.Context
evalCtx *eval.Context
md *opt.Metadata
minRowCount float64
}

func (sb *statisticsBuilder) init(ctx context.Context, evalCtx *eval.Context, md *opt.Metadata) {
// This initialization pattern ensures that fields are not unwittingly
// reused. Field reuse must be explicit.
*sb = statisticsBuilder{
ctx: ctx,
evalCtx: evalCtx,
md: md,
ctx: ctx,
evalCtx: evalCtx,
md: md,
minRowCount: evalCtx.SessionData().OptimizerMinRowCount,
}
}

Expand Down Expand Up @@ -837,7 +839,7 @@ func (sb *statisticsBuilder) colAvgSize(tabID opt.TableID, col opt.ColumnID) uin

func (sb *statisticsBuilder) buildScan(scan *ScanExpr, relProps *props.Relational) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -1086,7 +1088,7 @@ func (sb *statisticsBuilder) colStatScan(colSet opt.ColSet, scan *ScanExpr) *pro

func (sb *statisticsBuilder) buildSelect(sel *SelectExpr, relProps *props.Relational) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -1127,7 +1129,7 @@ func (sb *statisticsBuilder) colStatSelect(

func (sb *statisticsBuilder) buildProject(prj *ProjectExpr, relProps *props.Relational) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -1229,7 +1231,7 @@ func (sb *statisticsBuilder) buildInvertedFilter(
invFilter *InvertedFilterExpr, relProps *props.Relational,
) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -1290,7 +1292,7 @@ func (sb *statisticsBuilder) buildJoin(
}

s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -1821,7 +1823,7 @@ func (sb *statisticsBuilder) colStatFromJoinRight(

func (sb *statisticsBuilder) buildIndexJoin(indexJoin *IndexJoinExpr, relProps *props.Relational) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -1902,7 +1904,7 @@ func (sb *statisticsBuilder) buildZigzagJoin(
zigzag *ZigzagJoinExpr, relProps *props.Relational, h *joinPropsHelper,
) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -2003,7 +2005,7 @@ func (sb *statisticsBuilder) buildZigzagJoin(

func (sb *statisticsBuilder) buildGroupBy(groupNode RelExpr, relProps *props.Relational) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -2115,7 +2117,7 @@ func (sb *statisticsBuilder) colStatGroupBy(

func (sb *statisticsBuilder) buildSetNode(setNode RelExpr, relProps *props.Relational) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -2220,7 +2222,7 @@ func (sb *statisticsBuilder) colStatSetNodeImpl(
// buildValues builds the statistics for a VALUES expression.
func (sb *statisticsBuilder) buildValues(values ValuesContainer, relProps *props.Relational) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -2325,7 +2327,7 @@ func (sb *statisticsBuilder) colStatLiteralValues(

func (sb *statisticsBuilder) buildLimit(limit *LimitExpr, relProps *props.Relational) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -2368,7 +2370,7 @@ func (sb *statisticsBuilder) colStatLimit(

func (sb *statisticsBuilder) buildTopK(topK *TopKExpr, relProps *props.Relational) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -2410,7 +2412,7 @@ func (sb *statisticsBuilder) colStatTopK(colSet opt.ColSet, topK *TopKExpr) *pro

func (sb *statisticsBuilder) buildOffset(offset *OffsetExpr, relProps *props.Relational) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -2463,7 +2465,7 @@ func (sb *statisticsBuilder) colStatOffset(

func (sb *statisticsBuilder) buildMax1Row(max1Row *Max1RowExpr, relProps *props.Relational) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -2493,7 +2495,7 @@ func (sb *statisticsBuilder) colStatMax1Row(

func (sb *statisticsBuilder) buildOrdinality(ord *OrdinalityExpr, relProps *props.Relational) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -2538,7 +2540,7 @@ func (sb *statisticsBuilder) colStatOrdinality(

func (sb *statisticsBuilder) buildWindow(window *WindowExpr, relProps *props.Relational) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -2606,7 +2608,7 @@ func (sb *statisticsBuilder) buildProjectSet(
projectSet *ProjectSetExpr, relProps *props.Relational,
) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -2739,7 +2741,7 @@ func (sb *statisticsBuilder) buildWithScan(
withScan *WithScanExpr, relProps, bindingProps *props.Relational,
) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -2781,7 +2783,7 @@ func (sb *statisticsBuilder) colStatWithScan(

func (sb *statisticsBuilder) buildMutation(mutation RelExpr, relProps *props.Relational) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -2819,7 +2821,7 @@ func (sb *statisticsBuilder) colStatMutation(

func (sb *statisticsBuilder) buildLock(lock *LockExpr, relProps *props.Relational) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -2853,7 +2855,7 @@ func (sb *statisticsBuilder) buildVectorSearch(
search *VectorSearchExpr, relProps *props.Relational,
) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -2910,7 +2912,7 @@ func (sb *statisticsBuilder) buildVectorPartitionSearch(
search *VectorPartitionSearchExpr, relProps *props.Relational,
) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -2945,7 +2947,7 @@ func (sb *statisticsBuilder) colStatVectorPartitionSearch(

func (sb *statisticsBuilder) buildBarrier(barrier *BarrierExpr, relProps *props.Relational) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short cut if cardinality is 0.
return
}
Expand Down Expand Up @@ -2979,7 +2981,7 @@ func (sb *statisticsBuilder) colStatBarrier(

func (sb *statisticsBuilder) buildCall(call *CallExpr, relProps *props.Relational) {
s := relProps.Statistics()
if zeroCardinality := s.Init(relProps); zeroCardinality {
if zeroCardinality := s.Init(relProps, sb.minRowCount); zeroCardinality {
// Short-cut if cardinality is 0.
return
}
Expand Down
3 changes: 2 additions & 1 deletion pkg/sql/opt/memo/statistics_builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,8 @@ func TestGetStatsFromConstraint(t *testing.T) {
relProps := &props.Relational{Cardinality: props.AnyCardinality}
relProps.NotNullCols = cs.ExtractNotNullCols(ctx, &evalCtx)
s := relProps.Statistics()
s.Init(relProps)
const minRowCount = 0
s.Init(relProps, minRowCount)

// Calculate distinct counts.
sb.applyConstraintSet(cs, true /* tight */, sel, relProps, relProps.Statistics())
Expand Down
Loading
Loading