diff --git a/executor/aggfuncs/aggfunc_test.go b/executor/aggfuncs/aggfunc_test.go index 80a37d0f6b4d9..69456ec7d32e7 100644 --- a/executor/aggfuncs/aggfunc_test.go +++ b/executor/aggfuncs/aggfunc_test.go @@ -165,13 +165,10 @@ func distinctUpdateMemDeltaGens(srcChk *chunk.Chunk, dataType *types.FieldType) switch dataType.GetType() { case mysql.TypeLonglong: val = strconv.FormatInt(row.GetInt64(0), 10) - memDelta = aggfuncs.DefInt64Size case mysql.TypeFloat: val = strconv.FormatFloat(float64(row.GetFloat32(0)), 'f', 6, 64) - memDelta = aggfuncs.DefFloat64Size case mysql.TypeDouble: val = strconv.FormatFloat(row.GetFloat64(0), 'f', 6, 64) - memDelta = aggfuncs.DefFloat64Size case mysql.TypeNewDecimal: decimal := row.GetMyDecimal(0) hash, err := decimal.ToHashKey() @@ -190,7 +187,6 @@ func distinctUpdateMemDeltaGens(srcChk *chunk.Chunk, dataType *types.FieldType) memDelta = 16 case mysql.TypeDuration: val = strconv.FormatInt(row.GetInt64(0), 10) - memDelta = aggfuncs.DefInt64Size case mysql.TypeJSON: jsonVal := row.GetJSON(0) bytes := make([]byte, 0) diff --git a/executor/aggfuncs/func_avg.go b/executor/aggfuncs/func_avg.go index 6652af722301d..b32300392a600 100644 --- a/executor/aggfuncs/func_avg.go +++ b/executor/aggfuncs/func_avg.go @@ -246,6 +246,7 @@ func (e *avgOriginal4DistinctDecimal) UpdatePartialResult(sctx sessionctx.Contex continue } memDelta += p.valSet.Insert(decStr) + memDelta += int64(len(decStr)) newSum := new(types.MyDecimal) err = types.DecimalAdd(&p.sum, input, newSum) if err != nil { diff --git a/executor/aggfuncs/func_avg_test.go b/executor/aggfuncs/func_avg_test.go index 28fbb0095ecc8..0b1e1201559c3 100644 --- a/executor/aggfuncs/func_avg_test.go +++ b/executor/aggfuncs/func_avg_test.go @@ -20,8 +20,8 @@ import ( "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/mock" - "github.com/pingcap/tidb/util/set" ) func TestMergePartialResult4Avg(t *testing.T) { @@ -50,11 +50,11 @@ func TestMemAvg(t *testing.T) { buildAggMemTester(ast.AggFuncAvg, mysql.TypeNewDecimal, 5, aggfuncs.DefPartialResult4AvgDecimalSize, defaultUpdateMemDeltaGens, false), buildAggMemTester(ast.AggFuncAvg, mysql.TypeNewDecimal, 5, - aggfuncs.DefPartialResult4AvgDistinctDecimalSize+set.DefStringSetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4AvgDistinctDecimalSize+hack.DefBucketMemoryUsageForSetString, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncAvg, mysql.TypeDouble, 5, aggfuncs.DefPartialResult4AvgFloat64Size, defaultUpdateMemDeltaGens, false), buildAggMemTester(ast.AggFuncAvg, mysql.TypeDouble, 5, - aggfuncs.DefPartialResult4AvgDistinctFloat64Size+set.DefFloat64SetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4AvgDistinctFloat64Size+hack.DefBucketMemoryUsageForSetFloat64, distinctUpdateMemDeltaGens, true), } for _, test := range tests { testAggMemFunc(t, test) diff --git a/executor/aggfuncs/func_count_distinct.go b/executor/aggfuncs/func_count_distinct.go index 729727d7d51fe..f9e1c66db4bbb 100644 --- a/executor/aggfuncs/func_count_distinct.go +++ b/executor/aggfuncs/func_count_distinct.go @@ -189,6 +189,7 @@ func (e *countOriginalWithDistinct4Decimal) UpdatePartialResult(sctx sessionctx. continue } memDelta += p.valSet.Insert(decStr) + memDelta += int64(len(decStr)) } return memDelta, nil @@ -286,6 +287,7 @@ func (e *countOriginalWithDistinct4String) UpdatePartialResult(sctx sessionctx.C } input = stringutil.Copy(input) memDelta += p.valSet.Insert(input) + memDelta += int64(len(input)) } return memDelta, nil @@ -348,6 +350,7 @@ func (e *countOriginalWithDistinct) UpdatePartialResult(sctx sessionctx.Context, continue } memDelta += p.valSet.Insert(encodedString) + memDelta += int64(len(encodedString)) } return memDelta, nil diff --git a/executor/aggfuncs/func_count_test.go b/executor/aggfuncs/func_count_test.go index b6bbfcfae8151..6f8a684650a06 100644 --- a/executor/aggfuncs/func_count_test.go +++ b/executor/aggfuncs/func_count_test.go @@ -25,8 +25,8 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/mock" - "github.com/pingcap/tidb/util/set" "github.com/stretchr/testify/require" ) @@ -130,21 +130,21 @@ func TestMemCount(t *testing.T) { buildAggMemTester(ast.AggFuncCount, mysql.TypeDuration, 5, aggfuncs.DefPartialResult4CountSize, defaultUpdateMemDeltaGens, false), buildAggMemTester(ast.AggFuncCount, mysql.TypeLonglong, 5, - aggfuncs.DefPartialResult4CountDistinctIntSize+set.DefInt64SetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4CountDistinctIntSize+hack.DefBucketMemoryUsageForSetInt64, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncCount, mysql.TypeFloat, 5, - aggfuncs.DefPartialResult4CountDistinctRealSize+set.DefFloat64SetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4CountDistinctRealSize+hack.DefBucketMemoryUsageForSetFloat64, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncCount, mysql.TypeDouble, 5, - aggfuncs.DefPartialResult4CountDistinctRealSize+set.DefFloat64SetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4CountDistinctRealSize+hack.DefBucketMemoryUsageForSetFloat64, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncCount, mysql.TypeNewDecimal, 5, - aggfuncs.DefPartialResult4CountDistinctDecimalSize+set.DefStringSetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4CountDistinctDecimalSize+hack.DefBucketMemoryUsageForSetString, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncCount, mysql.TypeString, 5, - aggfuncs.DefPartialResult4CountDistinctStringSize+set.DefStringSetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4CountDistinctStringSize+hack.DefBucketMemoryUsageForSetString, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncCount, mysql.TypeDate, 5, - aggfuncs.DefPartialResult4CountWithDistinctSize+set.DefStringSetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4CountWithDistinctSize+hack.DefBucketMemoryUsageForSetString, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncCount, mysql.TypeDuration, 5, - aggfuncs.DefPartialResult4CountDistinctDurationSize+set.DefInt64SetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4CountDistinctDurationSize+hack.DefBucketMemoryUsageForSetInt64, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncCount, mysql.TypeJSON, 5, - aggfuncs.DefPartialResult4CountWithDistinctSize+set.DefStringSetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4CountWithDistinctSize+hack.DefBucketMemoryUsageForSetString, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncApproxCountDistinct, mysql.TypeLonglong, 5, aggfuncs.DefPartialResult4ApproxCountDistinctSize, approxCountDistinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncApproxCountDistinct, mysql.TypeString, 5, diff --git a/executor/aggfuncs/func_group_concat.go b/executor/aggfuncs/func_group_concat.go index d6f58481936c5..e838c78f1ff62 100644 --- a/executor/aggfuncs/func_group_concat.go +++ b/executor/aggfuncs/func_group_concat.go @@ -248,6 +248,7 @@ func (e *groupConcatDistinct) UpdatePartialResult(sctx sessionctx.Context, rowsI continue } memDelta += p.valSet.Insert(joinedVal) + memDelta += int64(len(joinedVal)) // write separator if p.buffer == nil { p.buffer = &bytes.Buffer{} @@ -577,6 +578,7 @@ func (e *groupConcatDistinctOrder) UpdatePartialResult(sctx sessionctx.Context, continue } memDelta += p.valSet.Insert(joinedVal) + memDelta += int64(len(joinedVal)) sortRow := sortRow{ buffer: buffer, byItems: make([]*types.Datum, 0, len(e.byItems)), diff --git a/executor/aggfuncs/func_group_concat_test.go b/executor/aggfuncs/func_group_concat_test.go index eef46c1260e27..68c5fbcfc2d16 100644 --- a/executor/aggfuncs/func_group_concat_test.go +++ b/executor/aggfuncs/func_group_concat_test.go @@ -66,13 +66,13 @@ func TestMemGroupConcat(t *testing.T) { multiArgsTest1 := buildMultiArgsAggMemTester(ast.AggFuncGroupConcat, []byte{mysql.TypeString, mysql.TypeString}, mysql.TypeString, 5, aggfuncs.DefPartialResult4GroupConcatSize+aggfuncs.DefBytesBufferSize, groupConcatMultiArgsUpdateMemDeltaGens, false) multiArgsTest2 := buildMultiArgsAggMemTester(ast.AggFuncGroupConcat, []byte{mysql.TypeString, mysql.TypeString}, mysql.TypeString, 5, - aggfuncs.DefPartialResult4GroupConcatDistinctSize+aggfuncs.DefBytesBufferSize+set.DefStringSetBucketMemoryUsage, groupConcatDistinctMultiArgsUpdateMemDeltaGens, true) + aggfuncs.DefPartialResult4GroupConcatDistinctSize+aggfuncs.DefBytesBufferSize+hack.DefBucketMemoryUsageForSetString, groupConcatDistinctMultiArgsUpdateMemDeltaGens, true) multiArgsTest3 := buildMultiArgsAggMemTester(ast.AggFuncGroupConcat, []byte{mysql.TypeString, mysql.TypeString}, mysql.TypeString, 5, aggfuncs.DefPartialResult4GroupConcatOrderSize+aggfuncs.DefTopNRowsSize, groupConcatOrderMultiArgsUpdateMemDeltaGens, false) multiArgsTest3.multiArgsAggTest.orderBy = true multiArgsTest4 := buildMultiArgsAggMemTester(ast.AggFuncGroupConcat, []byte{mysql.TypeString, mysql.TypeString}, mysql.TypeString, 5, - aggfuncs.DefPartialResult4GroupConcatOrderDistinctSize+aggfuncs.DefTopNRowsSize+set.DefStringSetBucketMemoryUsage, groupConcatDistinctOrderMultiArgsUpdateMemDeltaGens, true) + aggfuncs.DefPartialResult4GroupConcatOrderDistinctSize+aggfuncs.DefTopNRowsSize+hack.DefBucketMemoryUsageForSetString, groupConcatDistinctOrderMultiArgsUpdateMemDeltaGens, true) multiArgsTest4.multiArgsAggTest.orderBy = true multiArgsTests := []multiArgsAggMemTest{multiArgsTest1, multiArgsTest2, multiArgsTest3, multiArgsTest4} diff --git a/executor/aggfuncs/func_json_objectagg.go b/executor/aggfuncs/func_json_objectagg.go index 269813131d37c..099e4ca3a18fd 100644 --- a/executor/aggfuncs/func_json_objectagg.go +++ b/executor/aggfuncs/func_json_objectagg.go @@ -29,8 +29,6 @@ import ( const ( // DefPartialResult4JsonObjectAgg is the size of partialResult4JsonObject DefPartialResult4JsonObjectAgg = int64(unsafe.Sizeof(partialResult4JsonObjectAgg{})) - // DefMapStringInterfaceBucketSize = bucketSize*(1+unsafe.Sizeof(string) + unsafe.Sizeof(interface{}))+2*ptrSize - DefMapStringInterfaceBucketSize = 8*(1+16+16) + 16 ) type jsonObjectAgg struct { @@ -46,7 +44,7 @@ func (e *jsonObjectAgg) AllocPartialResult() (pr PartialResult, memDelta int64) p := partialResult4JsonObjectAgg{} p.entries = make(map[string]interface{}) p.bInMap = 0 - return PartialResult(&p), DefPartialResult4JsonObjectAgg + (1< (1< (1< bucketNum * loadFactor. The memory usage will doubled. + // Map will expand when count > bucketNum * loadFactor. The memory usage will double. if len(mapper) > (1< (1< (1< (1<