Skip to content

Commit b0c01fa

Browse files
authored
executor: fix an issue that index_lookup_hash_join incorrectly estimate memory usage. (#47795)
close #47788
1 parent 1d3b53e commit b0c01fa

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

pkg/executor/builder.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -4677,7 +4677,7 @@ func buildKvRangesForIndexJoin(ctx sessionctx.Context, tableID, indexID int64, l
46774677
memTracker.Consume(int64(2 * cap(kvRanges[0].StartKey) * len(kvRanges)))
46784678
}
46794679
if len(tmpDatumRanges) != 0 && memTracker != nil {
4680-
memTracker.Consume(2 * int64(len(tmpDatumRanges)) * types.EstimatedMemUsage(tmpDatumRanges[0].LowVal, len(tmpDatumRanges)))
4680+
memTracker.Consume(2 * types.EstimatedMemUsage(tmpDatumRanges[0].LowVal, len(tmpDatumRanges)))
46814681
}
46824682
if cwc == nil {
46834683
slices.SortFunc(kvRanges, func(i, j kv.KeyRange) int {

pkg/executor/executor_pkg_test.go

+57
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,63 @@ func TestBuildKvRangesForIndexJoinWithoutCwc(t *testing.T) {
7575
}
7676
}
7777

78+
func TestBuildKvRangesForIndexJoinWithoutCwcAndWithMemoryTracker(t *testing.T) {
79+
indexRanges := make([]*ranger.Range, 0, 6)
80+
indexRanges = append(indexRanges, generateIndexRange(1, 1, 1, 1, 1))
81+
indexRanges = append(indexRanges, generateIndexRange(1, 1, 2, 1, 1))
82+
indexRanges = append(indexRanges, generateIndexRange(1, 1, 2, 1, 2))
83+
indexRanges = append(indexRanges, generateIndexRange(1, 1, 3, 1, 1))
84+
indexRanges = append(indexRanges, generateIndexRange(2, 1, 1, 1, 1))
85+
indexRanges = append(indexRanges, generateIndexRange(2, 1, 2, 1, 1))
86+
87+
bytesConsumed1 := int64(0)
88+
{
89+
joinKeyRows := make([]*indexJoinLookUpContent, 0, 10)
90+
for i := int64(0); i < 10; i++ {
91+
joinKeyRows = append(joinKeyRows, &indexJoinLookUpContent{keys: generateDatumSlice(1, i)})
92+
}
93+
94+
keyOff2IdxOff := []int{1, 3}
95+
ctx := mock.NewContext()
96+
memTracker := memory.NewTracker(memory.LabelForIndexWorker, -1)
97+
kvRanges, err := buildKvRangesForIndexJoin(ctx, 0, 0, joinKeyRows, indexRanges, keyOff2IdxOff, nil, memTracker, nil)
98+
require.NoError(t, err)
99+
// Check the kvRanges is in order.
100+
for i, kvRange := range kvRanges {
101+
require.True(t, kvRange.StartKey.Cmp(kvRange.EndKey) < 0)
102+
if i > 0 {
103+
require.True(t, kvRange.StartKey.Cmp(kvRanges[i-1].EndKey) >= 0)
104+
}
105+
}
106+
bytesConsumed1 = memTracker.BytesConsumed()
107+
}
108+
109+
bytesConsumed2 := int64(0)
110+
{
111+
joinKeyRows := make([]*indexJoinLookUpContent, 0, 20)
112+
for i := int64(0); i < 20; i++ {
113+
joinKeyRows = append(joinKeyRows, &indexJoinLookUpContent{keys: generateDatumSlice(1, i)})
114+
}
115+
116+
keyOff2IdxOff := []int{1, 3}
117+
ctx := mock.NewContext()
118+
memTracker := memory.NewTracker(memory.LabelForIndexWorker, -1)
119+
kvRanges, err := buildKvRangesForIndexJoin(ctx, 0, 0, joinKeyRows, indexRanges, keyOff2IdxOff, nil, memTracker, nil)
120+
require.NoError(t, err)
121+
// Check the kvRanges is in order.
122+
for i, kvRange := range kvRanges {
123+
require.True(t, kvRange.StartKey.Cmp(kvRange.EndKey) < 0)
124+
if i > 0 {
125+
require.True(t, kvRange.StartKey.Cmp(kvRanges[i-1].EndKey) >= 0)
126+
}
127+
}
128+
bytesConsumed2 = memTracker.BytesConsumed()
129+
}
130+
131+
require.Equal(t, 2*bytesConsumed1, bytesConsumed2)
132+
require.Equal(t, int64(20760), bytesConsumed1)
133+
}
134+
78135
func generateIndexRange(vals ...int64) *ranger.Range {
79136
lowDatums := generateDatumSlice(vals...)
80137
highDatums := make([]types.Datum, len(vals))

0 commit comments

Comments
 (0)