Skip to content

Commit 5d6eac8

Browse files
pg_dump: Adjust reltuples from 0 to -1 for dumps of older versions.
Before v14, a reltuples value of 0 was ambiguous: it could either mean the relation is empty, or it could mean that it hadn't yet been vacuumed or analyzed. (Commit 3d351d9 taught v14 and newer to use -1 for the latter case.) This ambiguity allegedly can cause the planner to choose inefficient plans after restoring to v18 or newer. To fix, let's just dump reltuples as -1 in that case. This will cause some truly empty tables to be seen as not-yet-processed, but that seems unlikely to cause too much trouble in practice. Note that we could alternatively teach pg_restore_relation_stats() to translate reltuples based on the version argument, but since that function doesn't exist until v18, there's no particular advantage to that approach. That is, there's no chance of restoring stats dumped from a pre-v14 server to another pre-v14 server. Per discussion, the current policy is to fix pre-v18 behavior differences during export and everything else during import. Commit 9879105 fixed a similar problem for vacuumdb by removing the check for reltuples != 0. Presumably we could reinstate that check now, but I've chosen to leave it in place in case reltuples isn't accurate. As before, processing some empty tables seems relatively harmless. Author: Hari Krishna Sunder <hari.db.pg@gmail.com> Reviewed-by: Jeff Davis <pgsql@j-davis.com> Reviewed-by: Corey Huinker <corey.huinker@gmail.com> Discussion: https://postgr.es/m/CAAeiqZ0o2p4SX5_xPcuAbbsmXjg6MJLNuPYSLUjC%3DWh-VeW64A%40mail.gmail.com
1 parent 1722d5e commit 5d6eac8

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

src/bin/pg_dump/pg_dump.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10929,7 +10929,20 @@ dumpRelationStats_dumper(Archive *fout, const void *userArg, const TocEntry *te)
1092910929
appendStringLiteralAH(out, rsinfo->dobj.name, fout);
1093010930
appendPQExpBufferStr(out, ",\n");
1093110931
appendPQExpBuffer(out, "\t'relpages', '%d'::integer,\n", rsinfo->relpages);
10932-
appendPQExpBuffer(out, "\t'reltuples', '%s'::real,\n", rsinfo->reltuples);
10932+
10933+
/*
10934+
* Before v14, a reltuples value of 0 was ambiguous: it could either mean
10935+
* the relation is empty, or it could mean that it hadn't yet been
10936+
* vacuumed or analyzed. (Newer versions use -1 for the latter case.)
10937+
* This ambiguity allegedly can cause the planner to choose inefficient
10938+
* plans after restoring to v18 or newer. To deal with this, let's just
10939+
* set reltuples to -1 in that case.
10940+
*/
10941+
if (fout->remoteVersion < 140000 && strcmp("0", rsinfo->reltuples) == 0)
10942+
appendPQExpBufferStr(out, "\t'reltuples', '-1'::real,\n");
10943+
else
10944+
appendPQExpBuffer(out, "\t'reltuples', '%s'::real,\n", rsinfo->reltuples);
10945+
1093310946
appendPQExpBuffer(out, "\t'relallvisible', '%d'::integer",
1093410947
rsinfo->relallvisible);
1093510948

0 commit comments

Comments
 (0)