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
Attachments
- v31-0004-Enable-in-place-updates-for-pg_restore_relation_.patch (text/x-patch) patch v31-0004
- v31-0002-Remove-schemaOnly-dataOnly-from-dump-restore-opt.patch (text/x-patch) patch v31-0002
- v31-0003-Enable-dumping-of-table-index-stats-in-pg_dump.patch (text/x-patch) patch v31-0003
- v31-0005-Enable-pg_clear_relation_stats-to-handle-differe.patch (text/x-patch) patch v31-0005
- v31-0001-Add-derivative-flags-dumpSchema-dumpData.patch (text/x-patch) patch v31-0001
- v31-0009-preserve-catalog-lists-across-staged-runs.patch (text/x-patch) patch v31-0009
- v31-0006-split-out-check_conn_options.patch (text/x-patch) patch v31-0006
- v31-0008-split-out-generate_catalog_list.patch (text/x-patch) patch v31-0008
- v31-0007-split-out-print_processing_notice.patch (text/x-patch) patch v31-0007
- v31-0010-Add-issues_sql_unlike-opposite-of-issues_sql_lik.patch (text/x-patch) patch v31-0010
- v31-0011-Add-force-analyze-to-vacuumdb.patch (text/x-patch) patch v31-0011
> > WHAT IS NOT DONE - EXTENDED STATISTICS > > It is a general consensus in the community that "nobody uses extended > statistics", though I've had difficulty getting actual figures to back this > up, even from my own employer. Surveying several vendors at PgConf.EU, the > highest estimate was that at most 1% of their customers used extended > statistics, though more probably should. This reinforces my belief that a > feature that would eliminate a major pain point in upgrades for 99% of > customers shouldn't be held back by the fact that the other 1% only have a > reduced hassle. > > However, having relation and attribute statistics carry over on major > version upgrades presents a slight problem: running vacuumdb > --analyze-in-stages after such an upgrade is completely unnecessary for > those without extended statistics, and would actually result in _worse_ > statistics for the database until the last stage is complete. Granted, > we've had great difficulty getting users to know that vacuumdb is a thing > that should be run, but word has slowly spread through our own > documentation and those "This one simple trick will make your postgres go > fast post-upgrade" blog posts. Those posts will continue to lurk in search > results long after this feature goes into release, and it would be a rude > surprise to users to find out that the extra work they put in to learn > about a feature that helped their upgrade in 17 was suddenly detrimental > (albeit temporarily) in 18. We should never punish people for only being a > little-bit current in their knowledge. Moreover, this surprise would > persist even after we add extended statistics import function functionality. > > I presented this problem to several people at PgConf.EU, and the consensus > least-bad solution was that vacuumdb should filter out tables that are not > missing any statistics when using options --analyze, --analyze-only, and > --analyze-in-stages, with an additional flag for now called --force-analyze > to restore the un-filtered functionality. This gives the outcome tree: > > 1. Users who do not have extended statistics and do not use (or not even > know about) vacuumdb will be blissfully unaware, and will get better > post-upgrade performance. > 2. Users who do not have extended statistics but use vacuumdb > --analyze-in-stages will be pleasantly surprised that the vacuumdb run is > almost a no-op, and completes quickly. Those who are surprised by this and > re-run vacuumdb --analyze-in-stages will get another no-op. > 3. Users who have extended statistics and use vacuumdb --analyze-in-stages > will get a quicker vacuumdb run, as only the tables with extended stats > will pass the filter. Subsequent re-runs of vacuumdb --analyze-in-stages > would be the no-op. > 4. Users who have extended statistics and don't use vacuumdb will still > get better performance than they would have without any stats imported. > > In case anyone is curious, I'm defining "missing stats" as a table/matview > with any of the following: > > 1. A table with an attribute that lacks a corresponding pg_statistic row. > 2. A table with an index with an expression attribute that lacks a > corresponding pg_statistic row (non-expression attributes just borrow the > pg_statistic row from the table's attribute). > 3. A table with at least one extended statistic that does not have a > corresponding pg_statistic_ext_data row. > > Note that none of these criteria are concerned with the substance of the > statistics (ex. pg_statistic row should have mcv stats but does not), > merely their row-existence. > > Some rejected alternative solutions were: > > 1. Adding a new option --analyze-missing-stats. While simple, few people > would learn about it, knowledge of it would be drowned out by the > aforementioned sea of existing blog posts. > 2. Adding --analyze-missing-stats and making --analyze-in-stages fail with > an error message educating the user about --analyze-missing-stats. Users > might not see the error, existing tooling wouldn't be able to act on the > error, and there are legitimate non-upgrade uses of --analyze-in-stages. > > MAIN CONCERN GOING FORWARD > > This change to vacuumdb will require some reworking of the > vacuum_one_database() function so that the list of tables analyzed is > preserved across the stages, as subsequent stages runs won't be able to > detect which tables were previously missing stats. > > Here's a rebased patchset, with the changes to vacuum broken down into baby steps to make things easier on a reviewer. 0001-0005 same as before, rebased. 0006-0009 structural changes to vacuumdb to make the new feature simpler. 0010 add test issues_sql_unlike, this was needed because we didn't have a way to determine that a given line _wasn't_ printed. 0011 add --force-analyze to vacuumdb and filter out tables with existing statistics otherwise.