Should CreateExprContext() be using ALLOCSET_DEFAULT_SIZES?

Started by Andres Freundabout 3 years ago2 messageshackers
Jump to latest
#1Andres Freund
andres@anarazel.de

Hi,

The thread around /messages/by-id/CADUqk8Uqw5QaUqLdd-0SBCvZVncrE3JMJB9+yDwO_uMv_hTYCg@mail.gmail.com
reminded me of the following:

ISTM that we really shouldn't use ALLOCSET_DEFAULT_SIZES for expression
contexts, as they most commonly see only a few small, or no, allocations.

That's true for OLTPish queries, but is is very often true even for analytics
queries.

Just because I had it loaded, here's the executor state for TPCH-Q01, which is
pretty expression heavy:

ExecutorState: 65536 total in 4 blocks; 42512 free (11 chunks); 23024 used
TupleSort main: 32832 total in 2 blocks; 7320 free (7 chunks); 25512 used
TupleSort sort: 8192 total in 1 blocks; 7928 free (0 chunks); 264 used
Caller tuples: 8192 total in 1 blocks (9 chunks); 6488 free (0 chunks); 1704 used
ExprContext: 8192 total in 1 blocks; 7928 free (0 chunks); 264 used
ExprContext: 8192 total in 1 blocks; 7928 free (0 chunks); 264 used
ExprContext: 8192 total in 1 blocks; 7928 free (0 chunks); 264 used
Grand total: 139328 bytes in 11 blocks; 88032 free (18 chunks); 51296 used

As you can see very little was allocated in the ExprContext's.

ISTM that we could save a reasonable amount of memory by using a smaller
initial size.

Not so sure if a smaller max size should be used though.

Greetings,

Andres Freund

#2Daniel Gustafsson
daniel@yesql.se
In reply to: Andres Freund (#1)
Re: Should CreateExprContext() be using ALLOCSET_DEFAULT_SIZES?

On 17 Feb 2023, at 05:01, Andres Freund <andres@anarazel.de> wrote:

ISTM that we really shouldn't use ALLOCSET_DEFAULT_SIZES for expression
contexts, as they most commonly see only a few small, or no, allocations.

Looking into this I think you are correct.

ISTM that we could save a reasonable amount of memory by using a smaller
initial size.

I experimented with the below trivial patch in CreateExprContext:

-       return CreateExprContextInternal(estate, ALLOCSET_DEFAULT_SIZES);
+       return CreateExprContextInternal(estate, ALLOCSET_START_SMALL_SIZES);

Across various (unscientific) benchmarks, including expression heavy TPC-H
queries, I can see consistent reductions in memory use and tiny (within the
margin of error) increases in performance. More importantly, I didn't see a
case of slowdowns with this applied or any adverse effects in terms of memory
use. Whenever the initial size isn't big enough the expr runtime is likely
exceeding the overhead from growing the allocation?

--
Daniel Gustafsson