On Sat, Jun 24, 2006 at 09:23:28AM -0400, Mark Woodward wrote: > > Can you try to explain more carefully how the whole thing would work? > > What would an index tuple point to? What pointers would a heap tuple > > have? What would an index scan do to find the row version it's interested > > in? What exactly would an update do? > > > Since we already allocate space for some notion of linked list, then all > I'm suggesting is we reverse the order, sort of. Currently it looks like > this: > > ver001->ver002->ver003->...-verN > > That's what t_ctid does now, right? Well, that's sort of stupid. Why not > have it do this: > > ver001->verN->...->ver003->ver002->| > ^---------------------------------/
You don't say where the index points or the order, but I'm assuming from your diagram that ver1 is the oldest, verN is the newest. Currently there is an index entry for each version, but in your version there is only an index entry for ver1, right? > This will speed up almost *all* queries when there are more than two > version of rows. > > OK, here is the behavior of an update: > (1) Find the latest version of the row You mean, find the version of the row which satisfies your snapshot. If the version pointed to by the index is it, you're done. Otherwise you follow the chain. The most common option being one step, because ver01 is likely to be invisible. > (2) Duplicate row and modify as per plan > (3) Set the t_ctid of the new row to the last "latest" > (4) Set the t_ctid of the first row to that of the new row > (5) Attempt to index the row > (6) If the first version of the row is in the index already (ver001) Don't > modify the index, otherwise, add the new version (just as before) This looks OK, I guess. I wouldn't know about locking... Have a nice day, -- Martijn van Oosterhout <email@example.com> http://svana.org/kleptog/ > From each according to his ability. To each according to his ability to > litigate.
Description: Digital signature