Optimize various aggregate deserialization functions, take 2
authorDavid Rowley <drowley@postgresql.org>
Thu, 26 Oct 2023 21:41:55 +0000 (10:41 +1300)
committerDavid Rowley <drowley@postgresql.org>
Thu, 26 Oct 2023 21:41:55 +0000 (10:41 +1300)
commit0c882a298881056176a27ccc44c5c3bb7c8f308c
treedee28f0e6d4017db9ceda35bfe41086f2b996427
parent26f988212eada9c586223cbbf876c7eb455044d9
Optimize various aggregate deserialization functions, take 2

f0efa5aec added initReadOnlyStringInfo to allow a StringInfo to be
initialized from an existing buffer and also relaxed the requirement
that a StringInfo's buffer must be NUL terminated at data[len].  Now
that we have that, there's no need for these aggregate deserial
functions to use appendBinaryStringInfo() as that rather wastefully
palloc'd a new buffer and memcpy'd in the bytea's buffer.  Instead, we can
just use the bytea's buffer and point the StringInfo directly to that
using the new initializer function.

In Amdahl's law, this speeds up the serial portion of parallel
aggregates and makes sum(numeric), avg(numeric), var_pop(numeric),
var_samp(numeric), variance(numeric), stddev_pop(numeric),
stddev_samp(numeric), stddev(numeric), array_agg(anyarray),
string_agg(text) and string_agg(bytea) scale better in parallel queries.

Author: David Rowley
Discussion: https://postgr.es/m/CAApHDvr%3De-YOigriSHHm324a40HPqcUhSp6pWWgjz5WwegR%3DcQ%40mail.gmail.com
src/backend/utils/adt/array_userfuncs.c
src/backend/utils/adt/numeric.c
src/backend/utils/adt/varlena.c