From c344083f2251ff262e711a376f47ddedb0daead1 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 (#34254) issue: #32252 pr: #34253 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 212015b440..7a91943ce0 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)