mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-12 18:34:36 +08:00
69c3936a14
Previously aggregate transition and combination functions were invoked by special case code in nodeAgg.c, evaluating input and filters separately using the expression evaluation machinery. That turns out to not be great for performance for several reasons: - repeated expression evaluations have some cost - the transition functions invocations are poorly predicted, as commonly there are multiple aggregates in a query, resulting in the same call-stack invoking different functions. - filter and input computation had to be done separately - the special case code made it hard to implement JITing of the whole transition function invocation Address this by building one large expression that computes input, evaluates filters, and invokes transition functions. This leads to moderate speedups in queries bottlenecked by aggregate computations, and enables large speedups for similar cases once JITing is done. There's potential for further improvement: - It'd be nice if we could simplify the somewhat expensive aggstate->all_pergroups lookups. - right now there's still an advance_transition_function invocation in nodeAgg.c, leading to some code duplication. Author: Andres Freund Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de |
||
---|---|---|
.. | ||
editors | ||
findoidjoins | ||
ifaddrs | ||
make_diff | ||
msvc | ||
pginclude | ||
pgindent | ||
ccsym | ||
check_bison_recursion.pl | ||
codelines | ||
copyright.pl | ||
FAQ2txt | ||
find_badmacros | ||
find_static | ||
find_typedef | ||
fix-old-flex-code.pl | ||
git_changelog | ||
git-external-diff | ||
make_ctags | ||
make_etags | ||
make_mkid | ||
pgtest | ||
RELEASE_CHANGES | ||
testint128.c | ||
valgrind.supp | ||
version_stamp.pl | ||
win32tzlist.pl |