• Tom Lane's avatar
    Fix a missed case in code for "moving average" estimate of reltuples. · 5bba65de
    Tom Lane authored
    It is possible for VACUUM to scan no pages at all, if the visibility map
    shows that all pages are all-visible.  In this situation VACUUM has no new
    information to report about the relation's tuple density, so it wasn't
    changing pg_class.reltuples ... but it updated pg_class.relpages anyway.
    That's wrong in general, since there is no evidence to justify changing the
    density ratio reltuples/relpages, but it's particularly bad if the previous
    state was relpages=reltuples=0, which means "unknown tuple density".
    We just replaced "unknown" with "zero".  ANALYZE would eventually recover
    from this, but it could take a lot of repetitions of ANALYZE to do so if
    the relation size is much larger than the maximum number of pages ANALYZE
    will scan, because of the moving-average behavior introduced by commit
    b4b6923e.
    
    The only known situation where we could have relpages=reltuples=0 and yet
    the visibility map asserts everything's visible is immediately following
    a pg_upgrade.  It might be advisable for pg_upgrade to try to preserve the
    relpages/reltuples statistics; but in any case this code is wrong on its
    own terms, so fix it.  Per report from Sergey Koposov.
    
    Back-patch to 8.4, where the visibility map was introduced, same as the
    previous change.
    5bba65de
relcache.c 140 KB