• Tom Lane's avatar
    Reduce semijoins with unique inner relations to plain inner joins. · 92a43e48
    Tom Lane authored
    If the inner relation can be proven unique, that is it can have no more
    than one matching row for any row of the outer query, then we might as
    well implement the semijoin as a plain inner join, allowing substantially
    more freedom to the planner.  This is a form of outer join strength
    reduction, but it can't be implemented in reduce_outer_joins() because
    we don't have enough info about the individual relations at that stage.
    Instead do it much like remove_useless_joins(): once we've built base
    relations, we can make another pass over the SpecialJoinInfo list and
    get rid of any entries representing reducible semijoins.
    
    This is essentially a followon to the inner-unique patch (commit 9c7f5229)
    and makes use of the proof machinery that that patch created.  We need only
    minor refactoring of innerrel_is_unique's API to support this usage.
    
    Per performance complaint from Teodor Sigaev.
    
    Discussion: https://postgr.es/m/f994fc98-389f-4a46-d1bc-c42e05cb43ed@sigaev.ru
    92a43e48
join.out 191 KB