aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/catalog/index.c22
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