This is an interesting idea. Although some catalog tables are not in catcaches, such as pg_depend, when scanning them, if there is any SharedInvalidationMessage, the CatalogSnapshot will be invalidated and recreated ("RelationInvalidatesSnapshotsOnly" in syscache.c) Maybe during the system_scan, it receives the SharedInvalidationMessages and returns the tuples which are out of date. systable_recheck_tuple is used in dependency.c for such case.
Tom Lane <t...@sss.pgh.pa.us> 于2024年1月14日周日 03:12写道: > I wrote: > > Xiaoran Wang <fanfuxiao...@gmail.com> writes: > >> Hmm, how about first checking if any invalidated shared messages have > been > >> accepted, then rechecking the tuple's visibility? > >> If there is no invalidated shared message accepted during > >> 'toast_flatten_tuple', > >> there is no need to do then visibility check, then it can save several > >> CPU cycles. > > > Meh, I'd just as soon not add the additional dependency/risk of bugs. > > This is an expensive and seldom-taken code path, so I don't think > > shaving a few cycles is really important. > > It occurred to me that this idea might be more interesting if we > could encapsulate it right into systable_recheck_tuple: something > like having systable_beginscan capture the current > SharedInvalidMessageCounter and save it in the SysScanDesc struct, > then compare in systable_recheck_tuple to possibly short-circuit > that work. This'd eliminate one of the main bug hazards in the > idea, namely that you might capture SharedInvalidMessageCounter too > late, after something's already happened. However, the whole idea > only works for catalogs that have catcaches, and the other users of > systable_recheck_tuple are interested in pg_depend which doesn't. > So that put a damper on my enthusiasm for the idea. > > regards, tom lane >