Tom Lane wrote:
ISTM we could fix that by extending the index VACUUM interface to
include two concepts: aside from "remove these TIDs when you find them",
there could be "replace these TIDs with those TIDs when you find them".
This would allow pointer-swinging to one of the child tuples, after
which the old root could be removed.

Implementing the "replace these TIDs" operation atomically would be simple, except for the new bitmap index am. It should be possible there as well, but if the old and new tid happen to be on a different bitmap page, it requires some care to avoid deadlocks.

Also, we'd need more work mem for vacuum.

This has got the same atomicity
problem as for CREATE INDEX, because it's the same thing: you're
de-HOT-ifying the child.

Not exactly. De-HOT-ifying, or chilling, a child means inserting new index entries. But if we're just replacing the tids from the existing index entries, it's ok if we crash after replacing some but not all of them. The next vacuum would replace the rest of the pointers, and remove the old root tuple.

--
  Heikki Linnakangas
  EnterpriseDB   http://www.enterprisedb.com

---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
      choose an index scan if your joining column's datatypes do not
      match

Reply via email to