On Mon, 1 Jul 2024 at 23:42, Matthias van de Meent <boekewurm+postg...@gmail.com> wrote: > > On Mon, 1 Jul 2024 at 12:49, David Rowley <dgrowle...@gmail.com> wrote: > > > > On Mon, 1 Jul 2024 at 22:07, Matthias van de Meent > > <boekewurm+postg...@gmail.com> wrote: > > > One thing I'm slightly concerned about is that this allocates another > > > 8 bytes for each attribute in the tuple descriptor. While that's not a > > > lot when compared with the ->attrs array, it's still quite a lot when > > > we might not care at all about this data; e.g. in temporary tuple > > > descriptors during execution, in intermediate planner nodes. > > > > I've not done it in the patch, but one way to get some of that back is > > to ditch pg_attribute.attcacheoff. There's no need for it after this > > patch. That's only 4 out of 8 bytes, however. > > FormData_pg_attribute as a C struct has 4-byte alignment; AFAIK it > doesn't have any fields that require 8-byte alignment? Only on 64-bit > systems we align the tuples on pages with 8-byte alignment, but > in-memory arrays of the struct wouldn't have to deal with that, AFAIK.
Yeah, 4-byte alignment. "out of 8 bytes" I was talking about is sizeof(TupleDescDeformAttr), which I believe is the same "another 8 bytes" you had mentioned. What I meant was that deleting attcacheoff only reduces FormData_pg_attribute by 4 bytes per column and adding TupleDescDeformAttr adds 8 per column, so we still use 4 more bytes per column with the patch. I really doubt the 4 bytes extra memory is a big concern here. It would be more concerning for patch that wanted to do something like change NAMEDATALEN to 128, but I think the main concern with that would be even slower tuple deforming. Additional memory would also be concerning, but I doubt that's more important than the issue of making all queries slower due to slower tuple deformation, which is what such a patch would result in. > > I think in most cases > > due to FormData_pg_attribute being so huge, the aset.c power-of-2 > > roundup behaviour will be unlikely to cross a power-of-2 boundary. > > ASet isn't the only allocator, but default enough for this to make sense, yes. It's the only allocator we use for allocating TupleDescs, so other types and their behaviour are not relevant here. > I'm not sure we have a pg_type entry that that supports numeric > attalign values without increasing the size of the field, as the one > single-byte integer-like type (char) is always used as a printable > character, and implied to always be printable through its usage in > e.g. nodeToString infrastructure. > > I'd love to have a better option, but we don't seem to have one yet. yeah, select typname from pg_Type where typalign = 'c' and typlen=1; has just bool and char. I'm happy to keep going with this version of the patch unless someone points out some good reason that we should go with the alternative instead. David