"Bruce Momjian" <bruce@momjian.us> writes:
> Looking at the patch I see:
>
> + /*
> + * Mark the page as clear of prunable tuples. If we find a tuple which
> + * may become prunable, we shall set the hint again.
> + */
> + PageClearPrunable(page);
>
> I like the idea of the page hint bit, but my question is if there is a
> long-running transaction, isn't each SELECT going to try to defragment a
> page over and over again because there is still something prunable on
> the page?
Well it'll try to prune the chains over and over again. If it doesn't find
anything it won't defragment, but yes.
I think we could tackle that by storing on the page the oldest xmax which
would allow us to prune a tuple. Then you could compare RecentGlobalXmin
against that and not bother looking at any other chains if it hasn't been
passed yet.
It would be hard to do that with single-chain pruning though, once you the
limiting tuple you would then wouldn't know what the next limiting xmax is
until the next time you do a full-page prune. Still that gets us down to at
most two full-page prunes per update instead of a potentially unbounded number
of prunes.
This seems like a further optimization to think about after we have a place to
trigger the pruning where it'll do the most good.
--
Gregory Stark
EnterpriseDB
http://www.enterprisedb.com
---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to
majordomo@postgresql.org so that your
message can get through to the mailing list cleanly