• Tom Lane's avatar
    Second try at fixing O(N^2) problem in foreign key references. · 2abfd9d5
    Tom Lane authored
    This replaces ill-fated commit 5ddc7288,
    which was reverted because it broke active uses of FK cache entries.  In
    this patch, we still do nothing more to invalidatable cache entries than
    mark them as needing revalidation, so we won't break active uses.  To keep
    down the overhead of InvalidateConstraintCacheCallBack(), keep a list of
    just the currently-valid cache entries.  (The entries are large enough that
    some added space for list links doesn't seem like a big problem.)  This
    would still be O(N^2) when there are many valid entries, though, so when
    the list gets too long, just force the "sinval reset" behavior to remove
    everything from the list.  I set the threshold at 1000 entries, somewhat
    arbitrarily.  Possibly that could be fine-tuned later.  Another item for
    future study is whether it's worth adding reference counting so that we
    could safely remove invalidated entries.  As-is, problem cases are likely
    to end up with large and mostly invalid FK caches.
    
    Like the previous attempt, backpatch to 9.3.
    
    Jan Wieck and Tom Lane
    2abfd9d5
ri_triggers.c 103 KB