Hi Peter,
Sorry for bringing up so old thread since I have some troubles to understand what is going on here. I'd start with something I can understand then raise my question I have right now. > > The difference here is that we're simply making an intelligent guess > -- there have been no index scans, but we're going to do a kind of > special index scan at the last minute to see if we can avoid a page > split. "Index scans" would cause the "simple index deletion" work and this "bottom-to-up" deletion works for the cases where the index scan doesn't happen. Index page split is expensive. Before the index page split, if we can remove the tuples which are invisible to all the clients, then some room may be saved, then the saved room may avoid the index page split totally. This is the general goal of this patch. IIUC, to detect some tuples, we have to go to heap page for the MVCC check, this is not free. So a important part of this patch is to intelligent guess which leaf page needs the "bottom-to-up deletion". This is the place I start to confuse. By checking the commits message / README, looks two metrics are used here. One is "logically unchanged index" hint, from "Each bottom-up deletion pass is triggered lazily in response to a flood of versions on an nbtree leaf page. This usually involves a "logically unchanged index" hint (these are produced by the executor mechanism added by commit 9dc718bd)." The other one is latestRemovedXid. from "The LP_DEAD deletion process (which is now called "simple deletion" to clearly distinguish it from bottom-up deletion) won't usually need to visit any extra table blocks to check these extra tuples. We have to visit the same table blocks anyway to generate a latestRemovedXid value (at least in the common case where the index deletion operation's WAL record needs such a value)." So my questions are: (a) How does the "logically unchanged index" hint can be helpful for this purpose? (b). What does the latestRemovedXid means, and which variable in code is used for this purpose. I searched "latestRemovedXid" but nothing is found. (c) What is the relationship between a and b. I mean if we *have to visit" the same table blocks (in the case of index-split?), then the IO-cost is paid anyway, do we still need the "logically unchanged index hint"? At last, appreciated for your effort on making this part much better! -- Best Regards Andy Fan