On Tue, Nov 17, 2020 at 10:46 AM Heikki Linnakangas <hlinn...@iki.fi> wrote: > 0.7% degradation is probably acceptable.
I haven't looked at this patch in a while and I'm pleased with the way it seems to have been redesigned. It seems relatively simple and unlikely to cause big headaches. I would say that 0.7% is probably not acceptable on a general workload, but it seems fine on a benchmark that is specifically designed to be a worst-case for this patch, which I gather is what's happening here. I think it would be nice if we could enable this feature by default. Does it cause a measurable regression on realistic workloads when enabled? I bet a default of 5 or 10 minutes would help many users. One idea for improving things might be to move the "return immediately" tests in CatCacheCleanupOldEntries() to the caller, and only call this function if they indicate that there is some purpose. This would avoid the function call overhead when nothing can be done. Perhaps the two tests could be combined into one and simplified. Like, suppose the code looks (roughly) like this: if (catcacheclock >= time_at_which_we_can_prune) CatCacheCleanupOldEntries(...); To make it that simple, we want catcacheclock and time_at_which_we_can_prune to be stored as bare uint64 quantities so we don't need TimestampDifference(). And we want time_at_which_we_can_prune to be set to PG_UINT64_MAX when the feature is disabled. But those both seem like pretty achievable things... and it seems like the result would probably be faster than what you have now. + * per-statement basis and additionaly udpated periodically two words spelled wrong +void +assign_catalog_cache_prune_min_age(int newval, void *extra) +{ + catalog_cache_prune_min_age = newval; +} hmm, do we need this? + /* + * Entries that are not accessed after the last pruning + * are removed in that seconds, and their lives are + * prolonged according to how many times they are accessed + * up to three times of the duration. We don't try shrink + * buckets since pruning effectively caps catcache + * expansion in the long term. + */ + ct->naccess = Min(2, ct->naccess); The code doesn't match the comment, it seems, because the limit here is 2, not 3. I wonder if this does anything anyway. My intuition is that when a catcache entry gets accessed at all it's probably likely to get accessed a bunch of times. If there are any meaningful thresholds here I'd expect us to be trying to distinguish things like 1000+ accesses vs. 100-1000 vs. 10-100 vs. 1-10. Or maybe we don't need to distinguish at all and can just have a single mark bit rather than a counter. -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company