Re: Thoughts on "killed tuples" index hint bits support on standby - Mailing list pgsql-hackers
From | Peter Geoghegan |
---|---|
Subject | Re: Thoughts on "killed tuples" index hint bits support on standby |
Date | |
Msg-id | CAH2-Wz=-BoaKgkN-MnKj6hFwO1BOJSA+yLMMO+LRZK932fNUXA@mail.gmail.com Whole thread Raw |
In response to | Re: Thoughts on "killed tuples" index hint bits support on standby (Michail Nikolaev <michail.nikolaev@gmail.com>) |
Responses |
Re: Thoughts on "killed tuples" index hint bits support on standby
|
List | pgsql-hackers |
On Wed, Jan 27, 2021 at 11:30 AM Michail Nikolaev <michail.nikolaev@gmail.com> wrote: > Sorry for necroposting, but if someone is interested - I hope the patch is ready now and available in the other thread(1). I wonder if it would help to not actually use the LP_DEAD bit for this. Instead, you could use the currently-unused-in-indexes LP_REDIRECT bit. The general idea here is that this status bit is interpreted as a "recently dead" bit in nbtree. It is always something that is true *relative* to some *ephemeral* coarse-grained definition of recently dead. Whether or not "recently dead" means "dead to my particular MVCC snapshot" can be determined using some kind of in-memory state that won't survive a crash (or a per-index-page epoch?). We still have LP_DEAD bits in this world, which work in the same way as now (and so unambiguously indicate that the index tuple is dead-to-all, at least on the primary). I think that this idea of a "recently dead" bit might be able to accomplish a few goals all at once, including your specific goal of setting "hint bits" in indexes. The issue here is that it would also be nice to use a "recently dead" bit on the primary, but if you do that then maybe you're back to the original problem. OTOH, I also think that we could repurpose the LP_NORMAL bit in index AMs, so we could potentially have 3 different definitions of dead-ness without great difficulty! Perhaps this doesn't seem all that helpful, since I am expanding scope here for a project that is already very difficult. And maybe it just isn't helpful -- I don't know. But it is at least possible that expanding scope could actually *help* your case a lot, even if you only ever care about your original goal. My personal experience with nbtree patches is just that: sometimes *expanding* scope actually makes things *easier*, not harder. This is sometimes called "The Inventor's Paradox": https://en.wikipedia.org/wiki/Inventor%27s_paradox Consider the example of my work on nbtree in PostgreSQL 12. It was actually about 6 or 7 enhancements, not just 1 big enhancement -- it is easy to forget that now. I think that it was *necessary* to add at least 5 of these enhancements at the same time (maybe 2 or so really were optional). This is deeply counter-intuitive, but still seems to be true in my case. The specific reasons why I believe that this is true of the PostgreSQL 12 work are complicated, but it boils down to this: the ~5 related-though-distinct enhancements were individually not all that compelling (certainly not compelling enough to make on-disk changes for), but were much greater than the sum of their parts when considered together. Maybe I got lucky there. More generally, the nbtree stuff that I worked on in 12, 13, and now 14 actually feels like one big project to me. I will refrain from explaining exactly why that is right now, but you might be very surprised at how closely related it all is. I didn't exactly plan it that way, but trying to see things in the most general terms turned out to be a huge asset to me. If there are several independent reasons to move in one particular direction all at once, you can generally afford to be wrong about a lot of things without it truly harming anybody. Plus it's easy to see that you will not frustrate future work that is closely related but distinct when that future work is *directly enabled* by what you're doing. What's more, the extra stuff I'm talking about probably has a bunch of other benefits on the primary, if done well. Consider how the deletion stuff with LP_DEAD bits now considers "extra" index tuples to delete when they're close by. We could even do something like that with these LP_REDIRECT/recently dead bits on the primary. I understand that it's hard to have a really long term outlook. I think that that's almost necessary when working on a project like this, though. Don't forget that this works both ways. Maybe a person that wanted to do this "recently dead" stuff (which sounds really interesting to me right now) would similarly be compelled to consider the bigger picture, including the question of setting hint bits on standbys -- this other person had better not make that harder in the future, for the same reasons (obviously what you want to do here makes sense, it just isn't everything to everybody). This is yet another way in which expanding scope can help. -- Peter Geoghegan
pgsql-hackers by date: