From b49862d4f30d190869b11dfee9a457760c2811f9 Mon Sep 17 00:00:00 2001 From: wei liu Date: Mon, 1 Jul 2024 15:18:11 +0800 Subject: [PATCH] enhance: Optimize grow slice cost during query (#34253) issue: #32252 This PR try to pre-allocate FieldData for Reduce operations in the Query chain using typeutil.PrepareResultFieldData to avoid the overhead of dynamically growing the slice during appendFieldData process. --------- Signed-off-by: Wei Liu --- internal/proxy/task_query.go | 2 +- internal/querynodev2/segments/result.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/internal/proxy/task_query.go b/internal/proxy/task_query.go index 19e49fd165..8af0c20997 100644 --- a/internal/proxy/task_query.go +++ b/internal/proxy/task_query.go @@ -603,7 +603,6 @@ func reduceRetrieveResults(ctx context.Context, retrieveResults []*internalpb.Re return ret, nil } - ret.FieldsData = make([]*schemapb.FieldData, len(validRetrieveResults[0].GetFieldsData())) idSet := make(map[interface{}]struct{}) cursors := make([]int64, len(validRetrieveResults)) @@ -626,6 +625,7 @@ func reduceRetrieveResults(ctx context.Context, retrieveResults []*internalpb.Re } } + ret.FieldsData = typeutil.PrepareResultFieldData(validRetrieveResults[0].GetFieldsData(), int64(loopEnd)) var retSize int64 maxOutputSize := paramtable.Get().QuotaConfig.MaxOutputSize.GetAsInt64() for j := 0; j < loopEnd; { diff --git a/internal/querynodev2/segments/result.go b/internal/querynodev2/segments/result.go index 46b23337f8..f00b50ba2e 100644 --- a/internal/querynodev2/segments/result.go +++ b/internal/querynodev2/segments/result.go @@ -427,7 +427,7 @@ func MergeInternalRetrieveResult(ctx context.Context, retrieveResults []*interna loopEnd = int(param.limit) } - ret.FieldsData = make([]*schemapb.FieldData, len(validRetrieveResults[0].Result.GetFieldsData())) + ret.FieldsData = typeutil.PrepareResultFieldData(validRetrieveResults[0].Result.GetFieldsData(), int64(loopEnd)) idTsMap := make(map[interface{}]int64) cursors := make([]int64, len(validRetrieveResults)) @@ -556,6 +556,7 @@ func MergeSegcoreRetrieveResults(ctx context.Context, retrieveResults []*segcore limit = int(param.limit) } + ret.FieldsData = typeutil.PrepareResultFieldData(validRetrieveResults[0].Result.GetFieldsData(), int64(loopEnd)) cursors := make([]int64, len(validRetrieveResults)) idTsMap := make(map[any]int64)