Re: Statistics Import and Export
Corey Huinker <corey.huinker@gmail.com>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Change pg_dump default for statistics export.
- 34eb2a80d5a3 18.0 landed
-
pg_dump: Adjust reltuples from 0 to -1 for dumps of older versions.
- 5d6eac80cdce 18.0 landed
-
vacuumdb: Don't skip empty relations in --missing-stats-only mode.
- 987910502420 18.0 cited
-
pg_dump: Fix query for gathering attribute stats on older versions.
- f0d0083f52f9 18.0 landed
-
Prevent redeclaration of typedef TocEntry.
- 8ec0aaeae094 18.0 cited
-
Remove unused function parameters in pg_backup_archiver.c.
- ff3a7f0b6860 18.0 landed
-
pg_dump: Retrieve attribute statistics in batches.
- 9c02e3a986da 18.0 landed
-
pg_dump: Reduce memory usage of dumps with statistics.
- 7d5c83b4e90c 18.0 landed
-
Skip second WriteToc() call for custom-format dumps without data.
- e3cc039a7d93 18.0 landed
-
Add relallfrozen to pg_dump statistics.
- 4694aedf63bf 18.0 landed
-
Matview statistics depend on matview data.
- a0a4601765b8 18.0 cited
-
Add pg_dump --with-{schema|data|statistics} options.
- bde2fb797aae 18.0 landed
-
Stats: use schemaname/relname instead of regclass.
- 650ab8aaf195 18.0 landed
-
CREATE INDEX: do update index stats if autovacuum=off.
- 29d6808edebb 18.0 landed
-
Don't convert to and from floats in pg_dump.
- 1852aea3f526 18.0 landed
-
CREATE INDEX: don't update table stats if autovacuum=off.
- d611f8b1587b 18.0 landed
-
Organize and deduplicate statistics import tests.
- 1d33de9d6837 18.0 landed
-
Address stats export review comments.
- f9f4b43b8dc0 18.0 landed
-
Address stats import review comments.
- 298944e8d802 18.0 landed
-
Add relallfrozen to pg_class
- 99f8f3fbbc8f 18.0 cited
-
Fix pg_strtof() to not crash on NULL endptr.
- ebe919e95336 13.21 landed
- d69c781084f5 17.5 landed
- c7303f01c574 15.13 landed
- 76fbb38ef69c 14.18 landed
- 5c64ece8aaf3 16.9 landed
- 00d61a08c5fa 18.0 landed
-
Use attnum to identify index columns in pg_restore_attribute_stats().
- 40e27d04b4f6 18.0 landed
-
pg_dump: prepare attribute stats query.
- 6ee3b91bad26 18.0 landed
-
Avoid unnecessary relation stats query in pg_dump.
- 8f427187db78 18.0 landed
-
Remove redundant pg_set_*_stats() variants.
- a5cbdeb98af9 18.0 landed
-
Do not use in-place updates for statistics import.
- f3dae2ae5856 18.0 landed
-
Fix confusion about data type of pg_class.relpages and relallvisible.
- 9de2cc455eb9 18.0 landed
-
Documentation fixups for dumping statistics.
- cb45dc3afb05 18.0 landed
-
Trial fix for old cross-version upgrades.
- ab84d0ff806d 18.0 landed
-
Transfer statistics during pg_upgrade.
- 1fd1bd871012 18.0 landed
-
Lock table in ShareUpdateExclusive when importing index stats.
- 9f12da78d953 18.0 landed
-
Use in-place updates for pg_restore_relation_stats().
- a43567483c61 18.0 landed
-
Improve error message for replication of generated columns.
- 8fcd80258bcf 18.0 cited
-
pg_dump: Add dumpSchema and dumpData derivative flags.
- 96a81c1be929 18.0 landed
-
Disallow modifying statistics on system columns.
- 869ee4f10eca 18.0 landed
-
Add missing CommandCounterIncrement() in stats import functions.
- f22e436bff77 18.0 landed
-
Add functions pg_restore_relation_stats(), pg_restore_attribute_stats().
- d32d1463995c 18.0 landed
-
Documentation fixup.
- 07d00692c8da 18.0 landed
-
Add functions pg_set_attribute_stats() and pg_clear_attribute_stats().
- ce207d2a7901 18.0 landed
-
Change pg_*_relation_stats() functions to return type to void.
- dbe6bd4343d8 18.0 landed
-
Disable autovacuum for tables in stats import tests.
- 779972e534c0 18.0 landed
-
Allow pg_set_relation_stats() to set relpages to -1.
- b391d882ff38 18.0 landed
-
Fixup for pg_set_relation_stats().
- 35a015a60045 18.0 landed
-
Create functions pg_set_relation_stats, pg_clear_relation_stats.
- e839c8ecc935 18.0 landed
-
Add memory/disk usage for Window aggregate nodes in EXPLAIN.
- 95d6e9af07d2 18.0 cited
-
Improve performance of dumpSequenceData().
- bd15b7db489d 18.0 cited
-
Add INJECTION_POINT_CACHED() to run injection points directly from cache
- a0a5869a8598 18.0 cited
-
Improve performance of binary_upgrade_set_pg_class_oids().
- 2329cad1b93f 18.0 cited
-
Improve assertion in mdwritev()
- f04d1c1db011 17.0 cited
-
CREATE INDEX: do not update stats during binary upgrade.
- 71b66171d045 17.0 landed
-
Redefine pg_class.reltuples to be -1 before the first VACUUM or ANALYZE.
- 3d351d916b20 14.0 cited
> * Doc build error and malformatting. > Looking into it. > * I'm not certain that we want all changes to relation stats to be non- > transactional. Are there transactional use cases? Should it be an > option? Should it be transactional for pg_set_relation_stats() but non- > transactional for pg_restore_relation_stats()? > It's non-transactional because that's how ANALYZE does it to avoid bloating pg_class. We _could_ do it transactionally, but on restore we'd immediately have a pg_class that was 50% bloat. > > * The documentation for the pg_set_attribute_stats() still refers to > upgrade scenarios -- shouldn't that be in the > pg_restore_attribute_stats() docs? I imagine the pg_set variant to be > used for ad-hoc planner stuff rather than upgrades. > Noted. > > * For the "WARNING: stat names must be of type text" I think we need an > ERROR instead. The calling convention of name/value pairs is broken and > we can't safely continue. > They can't be errors, because any one error fails the whole pg_upgrade. > * The huge list of "else if (strcmp(statname, mc_freqs_name) == 0) ..." > seems wasteful and hard to read. I think we already discussed this, > what was the reason we can't just use an array to map the arg name to > an arg position type OID? > That was my overreaction to the dislike that the P_argname enum got in previous reviews. We'd need an array of struct like argname (ex. "mc_vals") argtypeoid (one of: int, text, real, rea[]) argtypename (name we want to call the argtypeoid (integer, text. real, real[] about covers it). argpos (position in the arg list of the corresponding pg_set_ function > > * How much error checking did we decide is appropriate? Do we need to > check that range_length_hist is always specified with range_empty_frac, > or should we just call that the planner's problem if one is specified > and the other not? Similarly, range stats for a non-range type. > I suppose we can let that go, and leave incomplete stat pairs in there. The big risk is that somebody packs the call with more than 5 statkinds, which would overflow the struct. > * I think most of the tests should be of pg_set_*_stats(). For > pg_restore_, we just want to know that it's translating the name/value > pairs reasonably well and throwing WARNINGs when appropriate. Then, for > pg_dump tests, it should exercise pg_restore_*_stats() more completely. > I was afraid you'd suggest that, in which case I'd break up the patch into the pg_sets and the pg_restores. > * It might help to clarify which arguments are important (like > n_distinct) vs not. I assume the difference is that it's a non-NULLable > column in pg_statistic. > There are NOT NULL stats...now. They might not be in the future. Does that change your opinion? > > * Some arguments, like the relid, just seem absolutely required, and > it's weird to just emit a WARNING and return false in that case. Again, we can't fail.Any one failure breaks pg_upgrade. > * To clarify: a return of "true" means all settings were successfully > applied, whereas "false" means that some were applied and some were > unrecognized, correct? Or does it also mean that some recognized > options may not have been applied? > True means "at least some stats were applied. False means "nothing was modified". > * pg_set_attribute_stats(): why initialize the output tuple nulls array > to false? It seems like initializing it to true would be safer. > +1 > > * please use a better name for "k" and add some error checking to make > sure it doesn't overrun the available slots. > k was an inheritance from analzye.c, from whence the very first version was cribbed. No objection to renaming. > * the pg_statistic tuple is always completely replaced, but the way you > can call pg_set_attribute_stats() doesn't imply that -- calling > pg_set_attribute_stats(..., most_common_vals => ..., most_common_freqs > => ...) looks like it would just replace the most_common_vals+freqs and > leave histogram_bounds as it was, but it actually clears > histogram_bounds, right? Should we make that work or should we document > better that it doesn't? > That would complicate things. How would we intentionally null-out one stat, while leaving others unchanged? However, this points out that I didn't re-instate the re-definition that applied the NULL defaults.