• Tom Lane's avatar
    Rethink heuristics for choosing index quals for parameterized paths. · 3b8968f2
    Tom Lane authored
    Some experimentation with examples similar to bug #7539 has convinced me
    that indxpath.c's original implementation of parameterized-path generation
    was several bricks shy of a load.  In general, if we are relying on a
    particular outer rel or set of outer rels for a parameterized path, the
    path should use every indexable join clause that's available from that rel
    or rels.  Any join clauses that get left out of the indexqual will end up
    getting applied as plain filter quals (qpquals), and that's generally a
    significant loser compared to having the index AM enforce them.  (This is
    particularly true with btree, which can skip the index scan entirely if
    it can see that the given indexquals are mutually contradictory.)  The
    original heuristics failed to ensure this, though, and were overly
    complicated anyway.  Rewrite to make the code explicitly identify each
    useful set of outer rels and then select all applicable join clauses for
    each one.  The one plan that changes in the regression tests is in fact
    for the better according to the planner's cost estimates.
    
    (Note: this is not a correctness issue but just a matter of plan quality.
    I don't yet know what is going on in bug #7539, but I don't expect this
    change to fix that.)
    3b8968f2
join.sql 26.1 KB