• Tom Lane's avatar
    Improve typcache: cache negative lookup results, add invalidation logic. · e384ed6c
    Tom Lane authored
    Previously, if the typcache had for example tried and failed to find a hash
    opclass for a given data type, it would nonetheless repeat the unsuccessful
    catalog lookup each time it was asked again.  This can lead to a
    significant amount of useless bufmgr traffic, as in a recent report from
    Scott Marlowe.  Like the catalog caches, typcache should be able to cache
    negative results.  This patch arranges that by making use of separate flag
    bits to remember whether a particular item has been looked up, rather than
    treating a zero OID as an indicator that no lookup has been done.
    
    Also, install a credible invalidation mechanism, namely watching for inval
    events in pg_opclass.  The sole advantage of the lack of negative caching
    was that the code would cope if operators or opclasses got added for a type
    mid-session; to preserve that behavior we have to be able to invalidate
    stale lookup results.  Updates in pg_opclass should be pretty rare in
    production systems, so it seems sufficient to just invalidate all the
    dependent data whenever one happens.
    
    Adding proper invalidation also means that this code will now react sanely
    if an opclass is dropped mid-session.  Arguably, that's a back-patchable
    bug fix, but in view of the lack of complaints from the field I'll refrain
    from back-patching.  (Probably, in most cases where an opclass is dropped,
    the data type itself is dropped soon after, so that this misfeasance has
    no bad consequences.)
    e384ed6c
typcache.c 39.3 KB