Add auxiliary lists to GUC data structures for better performance

Enterprise / PostgreSQL - Tom Lane [sss.pgh.pa.us] - 14 October 2022 16:36 UTC

The previous patch made addition of new GUCs cheap, but other GUC operations aren't improved and indeed get a bit slower, because hash_seq_search() is slower than just scanning a pointer array.

However, most performance-critical GUC operations only need to touch a relatively small fraction of the GUCs; especially so for AtEOXact_GUC(). We can improve matters at the cost of a bit more space by adding dlist or slist links to the GUC data structures. This patch invents lists that track

(1) all GUCs with non-default "source";

(2) all GUCs with nonempty state stack (implying they've been changed in the current transaction);

(3) all GUCs due for reporting to the client.

All of guc.c's performance-critical cases can make use of one or another of these lists to avoid searching the whole hash table. In particular, the stack list means that transaction end doesn't take time proportional to the number of GUCs, but only to the number changed in the current transaction.

Discussion: https://postgr.es/m/2982579.1662416866@sss.pgh.pa.us

f13b2088fa Add auxiliary lists to GUC data structures for better performance.
src/backend/utils/misc/guc.c | 255 +++++++++++++++++++++++++----------------
src/include/utils/guc_tables.h | 12 ++
2 files changed, 169 insertions(+), 98 deletions(-)

Upstream: git.postgresql.org


  • Share