From 7cd20c0373c4c0a821e243b6c40ec66cfb93481b Mon Sep 17 00:00:00 2001 From: Yansy Date: Sat, 5 Sep 2020 17:43:46 +0800 Subject: [PATCH] executor: implement memDelta for count funcs to track memUsage (#19770) * executor: implement memDelta for count funcs to track memUsage * fix stdlib unsafe need be group together and before non-stdlib group in ../../executor/aggfuncs/func_count.go * fix UpdatePartialResult memDelta return if err != nil * fix 1 DefPartialResult4CountSize is the memory usage of AllocPartialResult, UpdatePartialResult will not use more memory, return 0, err. 2 in testcase TestMemCount count funcs are not distinct, use defaultUpdateMemDeltaGens and set isDistinct false * fix UpdatePartialResult not use more memory * fix MergePartialResult memDelta Co-authored-by: ti-srebot <66930949+ti-srebot@users.noreply.github.com> --- executor/aggfuncs/func_count.go | 9 ++++++++- executor/aggfuncs/func_count_test.go | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/executor/aggfuncs/func_count.go b/executor/aggfuncs/func_count.go index c6e92cc6d4b11..abc2bc17cde17 100644 --- a/executor/aggfuncs/func_count.go +++ b/executor/aggfuncs/func_count.go @@ -14,10 +14,17 @@ package aggfuncs import ( + "unsafe" + "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/chunk" ) +const ( + // DefPartialResult4CountSize is the size of partialResult4Count + DefPartialResult4CountSize = int64(unsafe.Sizeof(partialResult4Count(0))) +) + type baseCount struct { baseAggFunc } @@ -25,7 +32,7 @@ type baseCount struct { type partialResult4Count = int64 func (e *baseCount) AllocPartialResult() (pr PartialResult, memDelta int64) { - return PartialResult(new(partialResult4Count)), 0 + return PartialResult(new(partialResult4Count)), DefPartialResult4CountSize } func (e *baseCount) ResetPartialResult(pr PartialResult) { diff --git a/executor/aggfuncs/func_count_test.go b/executor/aggfuncs/func_count_test.go index a52f48efa53f3..eb6bf296dd743 100644 --- a/executor/aggfuncs/func_count_test.go +++ b/executor/aggfuncs/func_count_test.go @@ -103,6 +103,20 @@ func (s *testSuite) TestCount(c *C) { func (s *testSuite) TestMemCount(c *C) { tests := []aggMemTest{ + buildAggMemTester(ast.AggFuncCount, mysql.TypeLonglong, 5, + aggfuncs.DefPartialResult4CountSize, defaultUpdateMemDeltaGens, false), + buildAggMemTester(ast.AggFuncCount, mysql.TypeFloat, 5, + aggfuncs.DefPartialResult4CountSize, defaultUpdateMemDeltaGens, false), + buildAggMemTester(ast.AggFuncCount, mysql.TypeDouble, 5, + aggfuncs.DefPartialResult4CountSize, defaultUpdateMemDeltaGens, false), + buildAggMemTester(ast.AggFuncCount, mysql.TypeNewDecimal, 5, + aggfuncs.DefPartialResult4CountSize, defaultUpdateMemDeltaGens, false), + buildAggMemTester(ast.AggFuncCount, mysql.TypeString, 5, + aggfuncs.DefPartialResult4CountSize, defaultUpdateMemDeltaGens, false), + buildAggMemTester(ast.AggFuncCount, mysql.TypeDate, 5, + aggfuncs.DefPartialResult4CountSize, defaultUpdateMemDeltaGens, false), + buildAggMemTester(ast.AggFuncCount, mysql.TypeDuration, 5, + aggfuncs.DefPartialResult4CountSize, defaultUpdateMemDeltaGens, false), buildAggMemTester(ast.AggFuncCount, mysql.TypeLonglong, 5, aggfuncs.DefPartialResult4CountDistinctIntSize, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncCount, mysql.TypeFloat, 5,