Skip to content

Commit 121910d

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

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

executor/builder.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4793,7 +4793,7 @@ func buildKvRangesForIndexJoin(ctx sessionctx.Context, tableID, indexID int64, l
47934793
memTracker.Consume(int64(2 * cap(kvRanges[0].StartKey) * len(kvRanges)))
47944794
}
47954795
if len(tmpDatumRanges) != 0 && memTracker != nil {
4796-
memTracker.Consume(2 * int64(len(tmpDatumRanges)) * types.EstimatedMemUsage(tmpDatumRanges[0].LowVal, len(tmpDatumRanges)))
4796+
memTracker.Consume(2 * types.EstimatedMemUsage(tmpDatumRanges[0].LowVal, len(tmpDatumRanges)))
47974797
}
47984798
if cwc == nil {
47994799
slices.SortFunc(kvRanges, func(i, j kv.KeyRange) bool {

executor/executor_pkg_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,63 @@ func TestBuildKvRangesForIndexJoinWithoutCwc(t *testing.T) {
7373
}
7474
}
7575

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

0 commit comments

Comments
 (0)