postgresql/contrib
David Rowley 1349d2790b Improve performance of ORDER BY / DISTINCT aggregates
ORDER BY / DISTINCT aggreagtes have, since implemented in Postgres, been
executed by always performing a sort in nodeAgg.c to sort the tuples in
the current group into the correct order before calling the transition
function on the sorted tuples.  This was not great as often there might be
an index that could have provided pre-sorted input and allowed the
transition functions to be called as the rows come in, rather than having
to store them in a tuplestore in order to sort them once all the tuples
for the group have arrived.

Here we change the planner so it requests a path with a sort order which
supports the most amount of ORDER BY / DISTINCT aggregate functions and
add new code to the executor to allow it to support the processing of
ORDER BY / DISTINCT aggregates where the tuples are already sorted in the
correct order.

Since there can be many ORDER BY / DISTINCT aggregates in any given query
level, it's very possible that we can't find an order that suits all of
these aggregates.  The sort order that the planner chooses is simply the
one that suits the most aggregate functions.  We take the most strictly
sorted variation of each order and see how many aggregate functions can
use that, then we try again with the order of the remaining aggregates to
see if another order would suit more aggregate functions.  For example:

SELECT agg(a ORDER BY a),agg2(a ORDER BY a,b) ...

would request the sort order to be {a, b} because {a} is a subset of the
sort order of {a,b}, but;

SELECT agg(a ORDER BY a),agg2(a ORDER BY c) ...

would just pick a plan ordered by {a} (we give precedence to aggregates
which are earlier in the targetlist).

SELECT agg(a ORDER BY a),agg2(a ORDER BY b),agg3(a ORDER BY b) ...

would choose to order by {b} since two aggregates suit that vs just one
that requires input ordered by {a}.

Author: David Rowley
Reviewed-by: Ronan Dunklau, James Coleman, Ranier Vilela, Richard Guo, Tom Lane
Discussion: https://postgr.es/m/CAApHDvpHzfo92%3DR4W0%2BxVua3BUYCKMckWAmo-2t_KiXN-wYH%3Dw%40mail.gmail.com
2022-08-02 23:11:45 +12:00
..
adminpack Use has_privs_for_roles for predefined role checks 2022-03-28 15:10:04 -04:00
amcheck Replace many MemSet calls with struct initialization 2022-07-16 08:50:49 +02:00
auth_delay Remove now superfluous declarations of dlsym()ed symbols. 2022-07-17 17:29:32 -07:00
auto_explain Make new auto_explain test safe for log_error_verbosity = verbose. 2022-07-31 12:29:44 -04:00
basebackup_to_shell Deal with paths containing \ and spaces in basebackup_to_shell tests 2022-07-18 10:32:15 -07:00
basic_archive Tweak detail and hint messages to be consistent with project policy 2022-07-20 09:50:12 +09:00
bloom Remove now superfluous declarations of dlsym()ed symbols. 2022-07-17 17:29:32 -07:00
bool_plperl Fix broken ruleutils support for function TRANSFORM clauses. 2021-01-25 13:03:43 -05:00
btree_gin Fix failure of btree_gin indexscans with "char" type and </<= operators. 2021-08-10 18:10:29 -04:00
btree_gist Pre-beta mechanical code beautification. 2022-05-12 15:17:30 -04:00
citext CREATE INDEX: use the original userid for more ACL checks. 2022-06-25 09:07:41 -07:00
cube Indent C code in flex and bison files 2022-05-13 07:17:29 +02:00
dblink Remove redundant null pointer checks before PQclear and PQconninfoFree 2022-07-03 20:11:05 +02:00
dict_int Update copyright for 2022 2022-01-07 19:04:57 -05:00
dict_xsyn Update copyright for 2022 2022-01-07 19:04:57 -05:00
earthdistance Make contrib modules' installation scripts more secure. 2020-08-10 10:44:42 -04:00
file_fdw Add regression test for TRUNCATE on foreign table not supporting TRUNCATE. 2022-07-20 09:35:14 +09:00
fuzzystrmatch Update copyright for 2022 2022-01-07 19:04:57 -05:00
hstore Mark all symbols exported from extension libraries PGDLLEXPORT. 2022-07-17 18:50:14 -07:00
hstore_plperl Remove now superfluous declarations of dlsym()ed symbols. 2022-07-17 17:29:32 -07:00
hstore_plpython Remove now superfluous declarations of dlsym()ed symbols. 2022-07-17 17:29:32 -07:00
intagg Make contrib modules' installation scripts more secure. 2020-08-10 10:44:42 -04:00
intarray Change some unnecessary MemSet calls 2022-07-01 00:16:38 +02:00
isn Remove now superfluous declarations of dlsym()ed symbols. 2022-07-17 17:29:32 -07:00
jsonb_plperl Expose internal function for converting int64 to numeric 2020-09-09 20:16:28 +02:00
jsonb_plpython Remove now superfluous declarations of dlsym()ed symbols. 2022-07-17 17:29:32 -07:00
lo Fix bogus CALLED_AS_TRIGGER() defenses. 2020-04-03 11:24:56 -04:00
ltree Mark all symbols exported from extension libraries PGDLLEXPORT. 2022-07-17 18:50:14 -07:00
ltree_plpython Remove now superfluous declarations of dlsym()ed symbols. 2022-07-17 17:29:32 -07:00
oid2name Change internal RelFileNode references to RelFileNumber or RelFileLocator. 2022-07-06 11:39:09 -04:00
old_snapshot Update copyright for 2022 2022-01-07 19:04:57 -05:00
pageinspect Replace many MemSet calls with struct initialization 2022-07-16 08:50:49 +02:00
passwordcheck Remove now superfluous declarations of dlsym()ed symbols. 2022-07-17 17:29:32 -07:00
pg_buffercache Add regression test coverage for contrib/pg_buffercache. 2022-07-30 15:33:44 -04:00
pg_freespacemap Avoid instabilities with the regression tests of pg_freespacemap 2022-03-29 13:52:49 +09:00
pg_prewarm Add a regression test for contrib/pg_prewarm. 2022-08-01 17:59:44 -04:00
pg_stat_statements Remove now superfluous declarations of dlsym()ed symbols. 2022-07-17 17:29:32 -07:00
pg_surgery Remove xloginsert.h from xlog.h 2022-01-30 12:25:24 -03:00
pg_trgm Remove now superfluous declarations of dlsym()ed symbols. 2022-07-17 17:29:32 -07:00
pg_visibility Replace many MemSet calls with struct initialization 2022-07-16 08:50:49 +02:00
pg_walinspect Replace many MemSet calls with struct initialization 2022-07-16 08:50:49 +02:00
pgcrypto Tidy up claimed supported CPUs and OSes. 2022-07-11 11:50:41 +12:00
pgrowlocks Use has_privs_for_roles for predefined role checks 2022-03-28 15:10:04 -04:00
pgstattuple Replace many MemSet calls with struct initialization 2022-07-16 08:50:49 +02:00
postgres_fdw Improve performance of ORDER BY / DISTINCT aggregates 2022-08-02 23:11:45 +12:00
seg Indent C code in flex and bison files 2022-05-13 07:17:29 +02:00
sepgsql Remove now superfluous declarations of dlsym()ed symbols. 2022-07-17 17:29:32 -07:00
spi Remove extraneous blank lines before block-closing braces 2022-04-13 19:16:02 +02:00
sslinfo contrib/sslinfo needs a fix too to make hamerkop happy. 2021-11-07 11:33:53 -05:00
start-scripts Remove contrib/start-scripts/osx/. 2017-11-17 12:53:20 -05:00
tablefunc Remove all traces of tuplestore_donestoring() in the C code 2022-02-17 09:52:02 +09:00
tcn Add a regression test for contrib/tcn. 2022-08-01 19:18:50 -04:00
test_decoding Allow users to skip logical replication of data having origin. 2022-07-21 08:47:38 +05:30
tsm_system_rows Update copyright for 2022 2022-01-07 19:04:57 -05:00
tsm_system_time Update copyright for 2022 2022-01-07 19:04:57 -05:00
unaccent Simplify a bit the special rules generating unaccent.rules 2022-07-05 16:17:51 +09:00
uuid-ossp Remove redundant null pointer checks before free() 2022-07-03 11:47:15 +02:00
vacuumlo Improve frontend error logging style. 2022-04-08 14:55:14 -04:00
xml2 Simplify SRFs using materialize mode in contrib/ modules 2022-03-08 10:12:22 +09:00
Makefile Add contrib/pg_walinspect. 2022-04-08 00:26:44 -07:00
README Rename 'gmake' to 'make' in docs and recommended commands 2014-02-12 17:29:19 -05:00
contrib-global.mk Respect TEMP_CONFIG when pg_regress_check and friends are called 2016-02-27 12:28:21 -05:00

README

The PostgreSQL contrib tree
---------------------------

This subtree contains porting tools, analysis utilities, and plug-in
features that are not part of the core PostgreSQL system, mainly
because they address a limited audience or are too experimental to be
part of the main source tree.  This does not preclude their
usefulness.

User documentation for each module appears in the main SGML
documentation.

When building from the source distribution, these modules are not
built automatically, unless you build the "world" target.  You can
also build and install them all by running "make all" and "make
install" in this directory; or to build and install just one selected
module, do the same in that module's subdirectory.

Some directories supply new user-defined functions, operators, or
types.  To make use of one of these modules, after you have installed
the code you need to register the new SQL objects in the database
system by executing a CREATE EXTENSION command.  In a fresh database,
you can simply do

    CREATE EXTENSION module_name;

See the PostgreSQL documentation for more information about this
procedure.