• Tom Lane's avatar
    Clamp semijoin selectivity to be not more than inner-join selectivity. · a314c340
    Tom Lane authored
    We should never estimate the output of a semijoin to be more rows than
    we estimate for an inner join with the same input rels and join condition;
    it's obviously impossible for that to happen.  However, given the
    relatively poor quality of our semijoin selectivity estimates ---
    particularly, but not only, in cases where we punt and return a default
    estimate --- we did often deliver such estimates.  To improve matters,
    calculate both estimates inside eqjoinsel() and take the smaller one.
    
    The bulk of this patch is just mechanical refactoring to avoid repetitive
    information lookup when we call both eqjoinsel_semi and eqjoinsel_inner.
    The actual new behavior is just
    
    	selec = Min(selec, inner_rel->rows * selec_inner);
    
    which looks a bit odd but is correct because of our different definitions
    for inner and semi join selectivity.
    
    There is one ensuing plan change in the regression tests, but it looks
    reasonable enough (and checking the actual row counts shows that the
    estimate moved closer to reality, not further away).
    
    Per bug #15160 from Alexey Ermakov.  Although this is arguably a bug fix,
    I won't risk destabilizing plan choices in stable branches by
    back-patching.
    
    Tom Lane, reviewed by Melanie Plageman
    
    Discussion: https://postgr.es/m/152395805004.19366.3107109716821067806@wrigleys.postgresql.org
    a314c340
partition_join.out 84 KB