Skip to content

Commit

Permalink
statistics: reduce the unnecessary allocations of context
Browse files Browse the repository at this point in the history
  • Loading branch information
winoros committed Apr 15, 2024
1 parent adcf88d commit a7b3939
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 31 deletions.
2 changes: 1 addition & 1 deletion pkg/planner/cardinality/row_count_column.go
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ func ColumnGreaterRowCount(sctx context.PlanContext, t *statistics.Table, value
if statistics.ColumnStatsIsInvalid(c, sctx, &t.HistColl, colID) {
return float64(t.RealtimeCount) / pseudoLessRate
}
return c.GreaterRowCount(value) * c.GetIncreaseFactor(t.RealtimeCount)
return c.GreaterRowCount(sctx, value) * c.GetIncreaseFactor(t.RealtimeCount)
}

// columnLessRowCount estimates the row count where the column less than value. Note that null values are not counted.
Expand Down
1 change: 0 additions & 1 deletion pkg/statistics/handle/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ go_library(
"//pkg/parser/mysql",
"//pkg/parser/terror",
"//pkg/sessionctx",
"//pkg/sessionctx/stmtctx",
"//pkg/sessionctx/sysproctrack",
"//pkg/statistics",
"//pkg/statistics/handle/autoanalyze",
Expand Down
6 changes: 3 additions & 3 deletions pkg/statistics/histogram.go
Original file line number Diff line number Diff line change
Expand Up @@ -489,9 +489,9 @@ func (hg *Histogram) EqualRowCount(sctx context.PlanContext, value types.Datum,

// GreaterRowCount estimates the row count where the column greater than value.
// It's deprecated. Only used for test.
func (hg *Histogram) GreaterRowCount(value types.Datum) float64 {
histRowCount, _ := hg.EqualRowCount(nil, value, false)
gtCount := hg.NotNullCount() - hg.LessRowCount(nil, value) - histRowCount
func (hg *Histogram) GreaterRowCount(sctx context.PlanContext, value types.Datum) float64 {
histRowCount, _ := hg.EqualRowCount(sctx, value, false)
gtCount := hg.NotNullCount() - hg.LessRowCount(sctx, value) - histRowCount
return math.Max(0, gtCount)
}

Expand Down
52 changes: 26 additions & 26 deletions pkg/statistics/statistics_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -518,23 +518,23 @@ func SubTestBuild() func(*testing.T) {
checkRepeats(t, col)
col.PreCalculateScalar(ctx.TypeCtx())
require.Equal(t, 226, col.Len())
count, _ := col.EqualRowCount(nil, types.NewIntDatum(1000), false)
count, _ := col.EqualRowCount(ctx, types.NewIntDatum(1000), false)
require.Equal(t, 0, int(count))
count = col.LessRowCount(nil, types.NewIntDatum(1000))
count = col.LessRowCount(ctx, types.NewIntDatum(1000))
require.Equal(t, 10000, int(count))
count = col.LessRowCount(nil, types.NewIntDatum(2000))
count = col.LessRowCount(ctx, types.NewIntDatum(2000))
require.Equal(t, 19999, int(count))
count = col.GreaterRowCount(types.NewIntDatum(2000))
count = col.GreaterRowCount(ctx.GetPlanCtx(), types.NewIntDatum(2000))
require.Equal(t, 80000, int(count))
count = col.LessRowCount(nil, types.NewIntDatum(200000000))
count = col.LessRowCount(ctx, types.NewIntDatum(200000000))
require.Equal(t, 100000, int(count))
count = col.GreaterRowCount(types.NewIntDatum(200000000))
count = col.GreaterRowCount(ctx.GetPlanCtx(), types.NewIntDatum(200000000))
require.Equal(t, 0.0, count)
count, _ = col.EqualRowCount(nil, types.NewIntDatum(200000000), false)
count, _ = col.EqualRowCount(ctx, types.NewIntDatum(200000000), false)
require.Equal(t, 0.0, count)
count = col.BetweenRowCount(nil, types.NewIntDatum(3000), types.NewIntDatum(3500))
count = col.BetweenRowCount(ctx, types.NewIntDatum(3000), types.NewIntDatum(3500))
require.Equal(t, 4994, int(count))
count = col.LessRowCount(nil, types.NewIntDatum(1))
count = col.LessRowCount(ctx, types.NewIntDatum(1))
require.Equal(t, 5, int(count))

colv2, topnv2, err := BuildHistAndTopN(ctx, int(bucketCount), topNCount, 2, collector, types.NewFieldType(mysql.TypeLonglong), true, nil, false)
Expand All @@ -548,19 +548,19 @@ func SubTestBuild() func(*testing.T) {
require.Equal(t, expectedTopNCount[i], meta.Count)
}
require.Equal(t, 251, colv2.Len())
count = colv2.LessRowCount(nil, types.NewIntDatum(1000))
count = colv2.LessRowCount(ctx, types.NewIntDatum(1000))
require.Equal(t, 328, int(count))
count = colv2.LessRowCount(nil, types.NewIntDatum(2000))
count = colv2.LessRowCount(ctx, types.NewIntDatum(2000))
require.Equal(t, 10007, int(count))
count = colv2.GreaterRowCount(types.NewIntDatum(2000))
count = colv2.GreaterRowCount(ctx.GetPlanCtx(), types.NewIntDatum(2000))
require.Equal(t, 80001, int(count))
count = colv2.LessRowCount(nil, types.NewIntDatum(200000000))
count = colv2.LessRowCount(ctx, types.NewIntDatum(200000000))
require.Equal(t, 90010, int(count))
count = colv2.GreaterRowCount(types.NewIntDatum(200000000))
count = colv2.GreaterRowCount(ctx.GetPlanCtx(), types.NewIntDatum(200000000))
require.Equal(t, 0.0, count)
count = colv2.BetweenRowCount(nil, types.NewIntDatum(3000), types.NewIntDatum(3500))
count = colv2.BetweenRowCount(ctx, types.NewIntDatum(3000), types.NewIntDatum(3500))
require.Equal(t, 5001, int(count))
count = colv2.LessRowCount(nil, types.NewIntDatum(1))
count = colv2.LessRowCount(ctx, types.NewIntDatum(1))
require.Equal(t, 0, int(count))

builder := SampleBuilder{
Expand All @@ -586,15 +586,15 @@ func SubTestBuild() func(*testing.T) {
checkRepeats(t, col)
col.PreCalculateScalar(ctx.TypeCtx())
require.Equal(t, 100000, int(tblCount))
count, _ = col.EqualRowCount(nil, encodeKey(types.NewIntDatum(10000)), false)
count, _ = col.EqualRowCount(ctx, encodeKey(types.NewIntDatum(10000)), false)
require.Equal(t, 1, int(count))
count = col.LessRowCount(nil, encodeKey(types.NewIntDatum(20000)))
count = col.LessRowCount(ctx, encodeKey(types.NewIntDatum(20000)))
require.Equal(t, 19999, int(count))
count = col.BetweenRowCount(nil, encodeKey(types.NewIntDatum(30000)), encodeKey(types.NewIntDatum(35000)))
count = col.BetweenRowCount(ctx, encodeKey(types.NewIntDatum(30000)), encodeKey(types.NewIntDatum(35000)))
require.Equal(t, 4999, int(count))
count = col.BetweenRowCount(nil, encodeKey(types.MinNotNullDatum()), encodeKey(types.NewIntDatum(0)))
count = col.BetweenRowCount(ctx, encodeKey(types.MinNotNullDatum()), encodeKey(types.NewIntDatum(0)))
require.Equal(t, 0, int(count))
count = col.LessRowCount(nil, encodeKey(types.NewIntDatum(0)))
count = col.LessRowCount(ctx, encodeKey(types.NewIntDatum(0)))
require.Equal(t, 0, int(count))

s.pk.(*recordSet).cursor = 0
Expand All @@ -603,15 +603,15 @@ func SubTestBuild() func(*testing.T) {
checkRepeats(t, col)
col.PreCalculateScalar(ctx.TypeCtx())
require.Equal(t, 100000, int(tblCount))
count, _ = col.EqualRowCount(nil, types.NewIntDatum(10000), false)
count, _ = col.EqualRowCount(ctx, types.NewIntDatum(10000), false)
require.Equal(t, 1, int(count))
count = col.LessRowCount(nil, types.NewIntDatum(20000))
count = col.LessRowCount(ctx, types.NewIntDatum(20000))
require.Equal(t, 20000, int(count))
count = col.BetweenRowCount(nil, types.NewIntDatum(30000), types.NewIntDatum(35000))
count = col.BetweenRowCount(ctx, types.NewIntDatum(30000), types.NewIntDatum(35000))
require.Equal(t, 5000, int(count))
count = col.GreaterRowCount(types.NewIntDatum(1001))
count = col.GreaterRowCount(ctx.GetPlanCtx(), types.NewIntDatum(1001))
require.Equal(t, 98998, int(count))
count = col.LessRowCount(nil, types.NewIntDatum(99999))
count = col.LessRowCount(ctx, types.NewIntDatum(99999))
require.Equal(t, 99999, int(count))

datum := types.Datum{}
Expand Down

0 comments on commit a7b3939

Please sign in to comment.