[Enhancement] Removes reserve() from array_agg(). (backport #56958) #57009
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Why I'm doing:
While debugging a slow query which took a few minutes, we found that it was due to skewed data.
But it was not clear why the skewed data caused such a long latency. After further investigation, I found that it was due to unnecessary
reserve()
calls inarray_agg()
.After appending a large array to a result column in one aggregated row, following
finalize_to_column()
s even with a small number of elements took a few ms likely to allocate new memory and copy existing values. Thousands of aggregated rows with a few ms added a lot of latency.Repeatedly calling
reserve()
with small increases is harmful. Withoutreserve()
, in the following append calls, std::vector would be able to increase the capacity exponentially efficiently.What I'm doing:
Removes
reserve()
.In a test on skewed data, a latency of a query with array_agg() decreased from 2m45s to 21s.
What type of PR is this:
Does this PR entail a change in behavior?
If yes, please specify the type of change:
Checklist: