• Tom Lane's avatar
    Optimize joins when the inner relation can be proven unique. · 9c7f5229
    Tom Lane authored
    If there can certainly be no more than one matching inner row for a given
    outer row, then the executor can move on to the next outer row as soon as
    it's found one match; there's no need to continue scanning the inner
    relation for this outer row.  This saves useless scanning in nestloop
    and hash joins.  In merge joins, it offers the opportunity to skip
    mark/restore processing, because we know we have not advanced past the
    first possible match for the next outer row.
    
    Of course, the devil is in the details: the proof of uniqueness must
    depend only on joinquals (not otherquals), and if we want to skip
    mergejoin mark/restore then it must depend only on merge clauses.
    To avoid adding more planning overhead than absolutely necessary,
    the present patch errs in the conservative direction: there are cases
    where inner_unique or skip_mark_restore processing could be used, but
    it will not do so because it's not sure that the uniqueness proof
    depended only on "safe" clauses.  This could be improved later.
    
    David Rowley, reviewed and rather heavily editorialized on by me
    
    Discussion: https://postgr.es/m/CAApHDvqF6Sw-TK98bW48TdtFJ+3a7D2mFyZ7++=D-RyPsL76gw@mail.gmail.com
    9c7f5229
join.out 189 KB