This is a wild and crazy thought which I am sure is invalid for some
good reason.
But why can't postgres just vacuum itself as it goes along?
When a row is orphaned it's added to a list of possibly available rows.
When a new row is needed the list of possible rows is examined and the
first one with a transaction id less then the lowest running transaction
id is chosen to be the new row? These rows can be in a heap so it's
really fast to find one.
Like magic - no more vacuuming. No more holes for people to fall into.
Is this an oversimplification of the problem?
Ralph