Re: Fast Default WIP patch for discussion

From: Robert Haas <robertmhaas(at)gmail(dot)com>
To: Serge Rielau <serge(at)rielau(dot)com>
Cc: Pg Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Fast Default WIP patch for discussion
Date: 2016-10-28 12:46:02
Message-ID: CA+Tgmoa9hm1e+XB5Tc-ANyyZVc7CHFsA4_dZ_MdSJVpSL643Eg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Fri, Oct 21, 2016 at 7:15 PM, Serge Rielau <serge(at)rielau(dot)com> wrote:
> Some key design points requiring discussion:
> 1. Storage of the “exist” (working name) default
> Right now the patch stores the default value in its binary form as it
> would be in the tuple into a BYTEA.
> It would be feasible to store the pretty printed literal, however this
> requires calling the io functions when a
> tuple descriptor is built.

A pretty-printed literal is a terrible idea because input functions
need not be immutable (e.g. timestamptz). I would have expected a
pg_node_tree column containing a CONST node, but your bytea thing
might be OK.

> 2. The exist default is cached alongside the “current” default in the tuple
> descriptor’s constraint structure.
> Seems most natural too me, but debatable.

No opinion (yet).

> 3. Delayed vs. early expansion of the tuples.
> To avoid having to decide when to copy tuple descriptors with or without
> constraints and defaults
> I have opted to expand the tuple at the core entry points.
> How do I know I have them all? An omission means wrong results!

Early expansion seems right. "How do I know I have them all?" - and
not only all of the current ones but all future ones - seems like a
core sticking point for this patch.

> 4. attisnull()
> This routine is used in many places, but to give correct result sit must
> now be accompanied
> by the tuple descriptor. This becomes moderately messy and it’s not
> always clear where to get that.
> Interestingly most usages are related to catalog lookups.
> Assuming we have no intention to support fast default for catalog tables
> we could keep using the
> existing attisnull() api for catalog lookups and use a new version (name
> tbd) for user tables.

attisnull is not a thing. There's heap_attisnull and slot_attisnull.

> 5. My head hurts looking at the PK/FK code - it’s not always clear which
> tuple descriptor belongs
> to which tuple

I suggest ibuprofen and a stiff upper lip.

> 6. Performance of the expansion code.
> The current code needs to walk all defaults and then start padding by
> filling in values.
> But the outcome is always the same. We will produce the same payload and
> the name null map.
> It would be feasible to cache an “all defaults tuple”, remember the
> offsets (and VARWIDTH, HASNULL)
> for each attribute and then simply splice the short and default tuples
> together.
> This ought to be faster, but the meta data to cache is not insignificant
> and the expansion code is messy enough
> without this already.

You could experiment to figure out if it makes any difference.

> 7. Grooming
> Obviously we can remove all exist defaults for a table from pg_attribute
> whenever the table is rewrittem.
> That’s easy.

But might cause the table to expand a lot, which would suck.

> But could we/should we keep track of the short tuples and either
> eliminate them or drop exist defaults once they
> become obsolete because there is no tuple short enough for them to
> matter.

I wouldn't mess with it.

> 8. Do we need to worry about toasted defaults?

Presumably.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Ashutosh Bapat 2016-10-28 12:47:52 Re: Danger of automatic connection reset in psql
Previous Message David Steele 2016-10-28 12:44:30 Re: Streaming basebackups vs pg_stat_tmp