Re: Statistics Import and Export
Tom Lane <tgl@sss.pgh.pa.us>
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
Corey Huinker <corey.huinker@gmail.com> writes: >> and I really think that we need to provide >> the source server's major version number --- maybe we will never >> need that, but if we do and we don't have it we will be sad. > The JSON had it, and I never did use it. Not against having it again. Well, you don't need it now seeing that the definition of pg_stats columns hasn't changed in the past ... but there's no guarantee we won't want to change them in the future. >> So this leads me to suggest that we'd be best off with a VARIADIC >> ANY signature, where the variadic part consists of alternating >> parameter labels and values: >> pg_set_attribute_stats(table regclass, attribute name, >> inherited bool, source_version int, >> variadic "any") returns void > I'm not aware of how strict works with variadics. Would the lack of any > variadic parameters trigger it? IIRC, "variadic any" requires having at least one variadic parameter. But that seems fine --- what would be the point, or even the semantics, of calling pg_set_attribute_stats with no data fields? > Also going with strict means that an inadvertent explicit NULL in one > parameter would cause the entire attribute import to fail silently. I'd > rather fail loudly. Not really convinced that that is worth any trouble... > * We can require the calling statement to cast arguments, particularly >> arrays, to the proper type, removing the need for conversions within >> the stats-setting function. (But instead, it'd need to check that the >> next "any" argument is the type it ought to be based on the type of >> the target column.) > So, that's tricky. The type of the values is not always the attribute type, Hmm. You would need to have enough smarts in pg_set_attribute_stats to identify the appropriate array type in any case: as coded, it needs that for coercion, whereas what I'm suggesting would only require it for checking, but either way you need it. I do concede that pg_dump (or other logic generating the calls) needs to know more under my proposal than before. I had been thinking that it would not need to hard-code that because it could look to see what the actual type is of the array it's dumping. However, I see that pg_typeof() doesn't work for that because it just returns anyarray. Perhaps we could invent a new backend function that extracts the actual element type of a non-null anyarray argument. Another way we could get to no-coercions is to stick with your signature but declare the relevant parameters as anyarray instead of text. I still think though that we'd be better off to leave the parameter matching to runtime, so that we-don't-recognize-that-field can be a warning not an error. >> * why is check_relation_permissions looking up the pg_class row? >> There's already a copy of that in the Relation struct. > To prove that the caller is the owner (or better) of the table. I think you missed my point: you're doing that inefficiently, and maybe even with race conditions. Use the relcache's copy of the pg_class row. >> * I'm dubious that we can fully vet the contents of these arrays, >> and even a little dubious that we need to try. > A lot of the feedback I got on this patch over the months concerned giving > inaccurate, nonsensical, or malicious data to the planner. Surely the > planner does do *some* defensive programming when fetching these values, > but this is the first time those values were potentially set by a user, not > by our own internal code. We can try to match types, collations, etc from > source to dest, but even that would fall victim to another glibc-level > collation change. That sort of concern is exactly why I think the planner has to, and does, defend itself. Even if you fully vet the data at the instant of loading, we might have the collation change under us later. It could be argued that feeding bogus data to the planner for testing purposes is a valid use-case for this feature. (Of course, as superuser we could inject bogus data into pg_statistic manually, so it's not necessary to have this feature for that purpose.) I guess I'm a great deal more sanguine than other people about the planner's ability to tolerate inconsistent data; but in any case I don't have a lot of faith in relying on checks in pg_set_attribute_stats to substitute for that ability. That idea mainly leads to having a whole lot of code that has to be kept in sync with other code that's far away from it and probably isn't coded in a parallel fashion either. >> * There's a lot of ERROR cases that maybe we ought to downgrade >> to WARN-and-press-on, in the service of not breaking the restore >> completely in case of trouble. > All cases were made error precisely to spark debate about which cases we'd > want to continue from and which we'd want to error from. Well, I'm here to debate it if you want, but I'll just note that *one* error will be enough to abort a pg_upgrade entirely, and most users these days get scared by errors during manual dump/restore too. So we had better not be throwing errors except for cases that we don't think pg_dump could ever emit. > Also, I was under > the impression it was bad form to follow up NOTICE/WARN with an ERROR in > the same function call. Seems like nonsense to me. WARN then ERROR about the same condition would be annoying, but that's not what we are talking about here. regards, tom lane