• T
    Revise parameterized-path mechanism to fix assorted issues. · 5b7b5518
    Tom Lane 提交于
    This patch adjusts the treatment of parameterized paths so that all paths
    with the same parameterization (same set of required outer rels) for the
    same relation will have the same rowcount estimate.  We cache the rowcount
    estimates to ensure that property, and hopefully save a few cycles too.
    Doing this makes it practical for add_path_precheck to operate without
    a rowcount estimate: it need only assume that paths with different
    parameterizations never dominate each other, which is close enough to
    true anyway for coarse filtering, because normally a more-parameterized
    path should yield fewer rows thanks to having more join clauses to apply.
    
    In add_path, we do the full nine yards of comparing rowcount estimates
    along with everything else, so that we can discard parameterized paths that
    don't actually have an advantage.  This fixes some issues I'd found with
    add_path rejecting parameterized paths on the grounds that they were more
    expensive than not-parameterized ones, even though they yielded many fewer
    rows and hence would be cheaper once subsequent joining was considered.
    
    To make the same-rowcounts assumption valid, we have to require that any
    parameterized path enforce *all* join clauses that could be obtained from
    the particular set of outer rels, even if not all of them are useful for
    indexing.  This is required at both base scans and joins.  It's a good
    thing anyway since the net impact is that join quals are checked at the
    lowest practical level in the join tree.  Hence, discard the original
    rather ad-hoc mechanism for choosing parameterization joinquals, and build
    a better one that has a more principled rule for when clauses can be moved.
    The original rule was actually buggy anyway for lack of knowledge about
    which relations are part of an outer join's outer side; getting this right
    requires adding an outer_relids field to RestrictInfo.
    5b7b5518
nodes.h 13.5 KB