Re: Terrible performance on wide selects - Mailing list pgsql-hackers

From Tom Lane
Subject Re: Terrible performance on wide selects
Date
Msg-id 25661.1043332885@sss.pgh.pa.us
Whole thread Raw
In response to Re: Terrible performance on wide selects  (Hannu Krosing <hannu@tm.ee>)
Responses Re: Terrible performance on wide selects
List pgsql-hackers
Hannu Krosing <hannu@tm.ee> writes:
>> i.e. for tuple with 100 cols, allocate an array of 100 pointers, plus
>> keep count of how many are actually valid,

> Additionally, this should also make repeted determining of NULL fields
> faster - just put a NULL-pointer in and voila - no more bit-shifting and
> AND-ing to find out if the field is null.

Right, the output of the operation would be a pair of arrays: Datum
values and is-null flags.  (NULL pointers don't work for pass-by-value
datatypes.)

I like the idea of keeping track of a last-known-column position and
incrementally extending that as needed.

I think the way to manage this is to add the overhead data (the output
arrays and last-column state) to TupleTableSlots.  Then we'd have
a routine similar to heap_getattr except that it takes a TupleTableSlot
and makes use of the extra state data.  The infrastructure to manage
the state data is already in place: for example, ExecStoreTuple would
reset the last-known-column to 0, ExecSetSlotDescriptor would be
responsible for allocating the output arrays using the natts value from
the provided tupdesc, etc.

This wouldn't help for accesses that are not in the context of a slot,
but certainly all the ones from ExecEvalVar are.  The executor always
works with tuples stored in slots, so I think we could fix all the
high-traffic cases this way.

            regards, tom lane

pgsql-hackers by date:

Previous
From: Adrian 'Dagurashibanipal' von Bidder
Date:
Subject: BAD sig (was: Re: v7.3.1 psql against a v7.2.x database ...)
Next
From: Tom Lane
Date:
Subject: Re: [PERFORM] Terrible performance on wide selects