diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/catalog/index.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 8e1741c81f5..022b9b99b13 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -63,6 +63,7 @@ #include "optimizer/optimizer.h" #include "parser/parser.h" #include "pgstat.h" +#include "postmaster/autovacuum.h" #include "rewrite/rewriteManip.h" #include "storage/bufmgr.h" #include "storage/lmgr.h" @@ -2841,6 +2842,27 @@ index_update_stats(Relation rel, update_stats = reltuples >= 0 && !IsBinaryUpgrade; /* + * If autovacuum is off, user may not be expecting table relstats to + * change. This can be important when restoring a dump that includes + * statistics, as the table statistics may be restored before the index is + * created, and we want to preserve the restored table statistics. + */ + if (AutoVacuumingActive()) + { + if (rel->rd_rel->relkind == RELKIND_RELATION || + rel->rd_rel->relkind == RELKIND_TOASTVALUE || + rel->rd_rel->relkind == RELKIND_MATVIEW) + { + StdRdOptions *options = (StdRdOptions *) rel->rd_options; + + if (options != NULL && !options->autovacuum.enabled) + update_stats = false; + } + } + else + update_stats = false; + + /* * Finish I/O and visibility map buffer locks before * systable_inplace_update_begin() locks the pg_class buffer. The rd_rel * we modify may differ from rel->rd_rel due to e.g. commit of concurrent |