Re: alter table set TABLE ACCESS METHOD - Mailing list pgsql-hackers

From Jeff Davis
Subject Re: alter table set TABLE ACCESS METHOD
Date
Msg-id 1033d6b4b5b42a014cc3f617265ae6e61cb5781b.camel@j-davis.com
Whole thread Raw
In response to Re: alter table set TABLE ACCESS METHOD  (Justin Pryzby <pryzby@telsasoft.com>)
Responses Re: alter table set TABLE ACCESS METHOD
List pgsql-hackers
On Thu, 2021-05-06 at 15:23 -0500, Justin Pryzby wrote:
> I think ALTER TABLE SET ACCESS METHOD should move all data off the
> old AM,
> including its toast table.

Can you explain what you mean, and why? I'm still confused.

Let's say there are 4 table AMs: A, AT, B, and BT. A's
relation_toast_am() returns AT, and B's relation_toast_am() returns BT.
AT or BT are invalid if A or B have relation_needs_toast_table() return
false.

Here are the cases that I see:

If A = B, then AT = BT, and it's all a no-op.

If A != B and BT is invalid (e.g. converting heap to columnar), then A
should detoast (and perhaps decompress, as in the case of columnar)
whatever it gets as input and do whatever it wants. That's what
columnar does and I don't see why ATRewriteTable needs to handle it.

If A != B and AT != BT, then B needs to detoast whatever it gets (but
should not decompress, as that would just be wasted effort), and then
re-toast using BT. Again, I don't see a need for ATRewriteTable to do
anything, B can handle it.

The only case I can really see where ATRewriteTable might be helpful is
if A != B but AT = BT. In that case, in theory, you don't need to do
anything to the toast table, just leave it where it is. But then the
responsibilities get a little confusing to me -- how is B supposed to
know that it doesn't need to toast anything? Is this the problem you
are trying to solve?

Regards,
    Jeff Davis





pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: AlterSubscription_refresh "wrconn" wrong variable?
Next
From: Alvaro Herrera
Date:
Subject: Re: Docs for lock level of ALTER TABLE .. VALIDATE