Change pg_dump default for statistics export.
authorJeff Davis <jdavis@postgresql.org>
Tue, 27 May 2025 19:53:10 +0000 (12:53 -0700)
committerJeff Davis <jdavis@postgresql.org>
Tue, 27 May 2025 20:54:38 +0000 (13:54 -0700)
Set the default behavior of pg_dump and pg_dumpall to be
--no-statistics.

Leave the default for pg_restore and pg_upgrade to be
--with-statistics.

Discussion: https://postgr.es/m/CA+TgmoZ9=RnWcCOZiKYYjZs_AW1P4QXCw--h4dOLLHuf1Omung@mail.gmail.com
Reviewed-by: Greg Sabino Mullane <htamfids@gmail.com>
Reviewed-by: Nathan Bossart <nathandbossart@gmail.com>
Reviewed-by: Robert Haas <robertmhaas@gmail.com>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
doc/src/sgml/ref/pg_dump.sgml
doc/src/sgml/ref/pg_dumpall.sgml
src/bin/pg_dump/pg_backup_archiver.c
src/bin/pg_dump/t/002_pg_dump.pl
src/bin/pg_upgrade/dump.c

index c10bca63e55c59bb56f6958d1bfa14f9365add6a..d7595a7e5468d8a3f7ad90dca3a64802c59eed7a 100644 (file)
@@ -1134,7 +1134,7 @@ PostgreSQL documentation
       <term><option>--no-statistics</option></term>
       <listitem>
        <para>
-        Do not dump statistics.
+        Do not dump statistics. This is the default.
        </para>
       </listitem>
      </varlistentry>
@@ -1461,7 +1461,7 @@ PostgreSQL documentation
       <term><option>--with-statistics</option></term>
       <listitem>
        <para>
-        Dump statistics. This is the default.
+        Dump statistics.
        </para>
       </listitem>
      </varlistentry>
@@ -1681,14 +1681,14 @@ CREATE DATABASE foo WITH TEMPLATE template0;
   </para>
 
   <para>
-   By default, <command>pg_dump</command> will include most optimizer
-   statistics in the resulting dump file.  However, some statistics may not be
-   included, such as those created explicitly with <xref
-   linkend="sql-createstatistics"/> or custom statistics added by an
-   extension.  Therefore, it may be useful to run <command>ANALYZE</command>
-   after restoring from a dump file to ensure optimal performance; see <xref
-   linkend="vacuum-for-statistics"/> and <xref linkend="autovacuum"/> for more
-   information.
+   If <option>--with-statistics</option> is specified,
+   <command>pg_dump</command> will include most optimizer statistics in the
+   resulting dump file.  However, some statistics may not be included, such as
+   those created explicitly with <xref linkend="sql-createstatistics"/> or
+   custom statistics added by an extension.  Therefore, it may be useful to
+   run <command>ANALYZE</command> after restoring from a dump file to ensure
+   optimal performance; see <xref linkend="vacuum-for-statistics"/> and <xref
+   linkend="autovacuum"/> for more information.
   </para>
 
   <para>
index 8c5141d036c76a541f2fa05c11e119bf321fb001..723a466cfaad62783a59f3bbb2a5d9f81da25abe 100644 (file)
@@ -567,7 +567,7 @@ exclude database <replaceable class="parameter">PATTERN</replaceable>
       <term><option>--no-statistics</option></term>
       <listitem>
        <para>
-        Do not dump statistics.
+        Do not dump statistics. This is the default.
        </para>
       </listitem>
      </varlistentry>
@@ -741,7 +741,7 @@ exclude database <replaceable class="parameter">PATTERN</replaceable>
       <term><option>--with-statistics</option></term>
       <listitem>
        <para>
-        Dump statistics. This is the default.
+        Dump statistics.
        </para>
       </listitem>
      </varlistentry>
@@ -957,14 +957,14 @@ exclude database <replaceable class="parameter">PATTERN</replaceable>
   </para>
 
   <para>
-   By default, <command>pg_dumpall</command> will include most optimizer
-   statistics in the resulting dump file.  However, some statistics may not be
-   included, such as those created explicitly with <xref
-   linkend="sql-createstatistics"/> or custom statistics added by an
-   extension.  Therefore, it may be useful to run <command>ANALYZE</command>
-   on each database after restoring from a dump file to ensure optimal
-   performance.  You can also run <command>vacuumdb -a -z</command> to analyze
-   all databases.
+   If <option>--with-statistics</option> is specified,
+   <command>pg_dumpall</command> will include most optimizer statistics in the
+   resulting dump file.  However, some statistics may not be included, such as
+   those created explicitly with <xref linkend="sql-createstatistics"/> or
+   custom statistics added by an extension.  Therefore, it may be useful to
+   run <command>ANALYZE</command> on each database after restoring from a dump
+   file to ensure optimal performance.  You can also run <command>vacuumdb -a
+   -z</command> to analyze all databases.
   </para>
 
   <para>
index afa42337b110fe15f1ef99f3fdbd9f4ff5bad3fe..175fe9c427395d1ff7f6544922b828f035f7ef4d 100644 (file)
@@ -152,7 +152,7 @@ InitDumpOptions(DumpOptions *opts)
    opts->dumpSections = DUMP_UNSECTIONED;
    opts->dumpSchema = true;
    opts->dumpData = true;
-   opts->dumpStatistics = true;
+   opts->dumpStatistics = false;
 }
 
 /*
index cf34f71ea11964bef195b9018b3355f801a07b96..386e21e0c596a5f972836f3149f6e3adc1313dcf 100644 (file)
@@ -68,6 +68,7 @@ my %pgdump_runs = (
            '--no-data',
            '--sequence-data',
            '--binary-upgrade',
+           '--with-statistics',
            '--dbname' => 'postgres',    # alternative way to specify database
        ],
        restore_cmd => [
@@ -75,6 +76,7 @@ my %pgdump_runs = (
            '--format' => 'custom',
            '--verbose',
            '--file' => "$tempdir/binary_upgrade.sql",
+           '--with-statistics',
            "$tempdir/binary_upgrade.dump",
        ],
    },
@@ -88,11 +90,13 @@ my %pgdump_runs = (
            '--format' => 'custom',
            '--compress' => '1',
            '--file' => "$tempdir/compression_gzip_custom.dump",
+           '--with-statistics',
            'postgres',
        ],
        restore_cmd => [
            'pg_restore',
            '--file' => "$tempdir/compression_gzip_custom.sql",
+           '--with-statistics',
            "$tempdir/compression_gzip_custom.dump",
        ],
        command_like => {
@@ -115,6 +119,7 @@ my %pgdump_runs = (
            '--format' => 'directory',
            '--compress' => 'gzip:1',
            '--file' => "$tempdir/compression_gzip_dir",
+           '--with-statistics',
            'postgres',
        ],
        # Give coverage for manually compressed blobs.toc files during
@@ -132,6 +137,7 @@ my %pgdump_runs = (
            'pg_restore',
            '--jobs' => '2',
            '--file' => "$tempdir/compression_gzip_dir.sql",
+           '--with-statistics',
            "$tempdir/compression_gzip_dir",
        ],
    },
@@ -144,6 +150,7 @@ my %pgdump_runs = (
            '--format' => 'plain',
            '--compress' => '1',
            '--file' => "$tempdir/compression_gzip_plain.sql.gz",
+           '--with-statistics',
            'postgres',
        ],
        # Decompress the generated file to run through the tests.
@@ -162,11 +169,13 @@ my %pgdump_runs = (
            '--format' => 'custom',
            '--compress' => 'lz4',
            '--file' => "$tempdir/compression_lz4_custom.dump",
+           '--with-statistics',
            'postgres',
        ],
        restore_cmd => [
            'pg_restore',
            '--file' => "$tempdir/compression_lz4_custom.sql",
+           '--with-statistics',
            "$tempdir/compression_lz4_custom.dump",
        ],
        command_like => {
@@ -189,6 +198,7 @@ my %pgdump_runs = (
            '--format' => 'directory',
            '--compress' => 'lz4:1',
            '--file' => "$tempdir/compression_lz4_dir",
+           '--with-statistics',
            'postgres',
        ],
        # Verify that data files were compressed
@@ -200,6 +210,7 @@ my %pgdump_runs = (
            'pg_restore',
            '--jobs' => '2',
            '--file' => "$tempdir/compression_lz4_dir.sql",
+           '--with-statistics',
            "$tempdir/compression_lz4_dir",
        ],
    },
@@ -212,6 +223,7 @@ my %pgdump_runs = (
            '--format' => 'plain',
            '--compress' => 'lz4',
            '--file' => "$tempdir/compression_lz4_plain.sql.lz4",
+           '--with-statistics',
            'postgres',
        ],
        # Decompress the generated file to run through the tests.
@@ -233,11 +245,13 @@ my %pgdump_runs = (
            '--format' => 'custom',
            '--compress' => 'zstd',
            '--file' => "$tempdir/compression_zstd_custom.dump",
+           '--with-statistics',
            'postgres',
        ],
        restore_cmd => [
            'pg_restore',
            '--file' => "$tempdir/compression_zstd_custom.sql",
+           '--with-statistics',
            "$tempdir/compression_zstd_custom.dump",
        ],
        command_like => {
@@ -259,6 +273,7 @@ my %pgdump_runs = (
            '--format' => 'directory',
            '--compress' => 'zstd:1',
            '--file' => "$tempdir/compression_zstd_dir",
+           '--with-statistics',
            'postgres',
        ],
        # Give coverage for manually compressed blobs.toc files during
@@ -279,6 +294,7 @@ my %pgdump_runs = (
            'pg_restore',
            '--jobs' => '2',
            '--file' => "$tempdir/compression_zstd_dir.sql",
+           '--with-statistics',
            "$tempdir/compression_zstd_dir",
        ],
    },
@@ -292,6 +308,7 @@ my %pgdump_runs = (
            '--format' => 'plain',
            '--compress' => 'zstd:long',
            '--file' => "$tempdir/compression_zstd_plain.sql.zst",
+           '--with-statistics',
            'postgres',
        ],
        # Decompress the generated file to run through the tests.
@@ -310,6 +327,7 @@ my %pgdump_runs = (
            'pg_dump', '--no-sync',
            '--file' => "$tempdir/clean.sql",
            '--clean',
+           '--with-statistics',
            '--dbname' => 'postgres',    # alternative way to specify database
        ],
    },
@@ -320,6 +338,7 @@ my %pgdump_runs = (
            '--clean',
            '--if-exists',
            '--encoding' => 'UTF8',      # no-op, just for testing
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -338,6 +357,7 @@ my %pgdump_runs = (
            '--create',
            '--no-reconnect',    # no-op, just for testing
            '--verbose',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -356,6 +376,7 @@ my %pgdump_runs = (
        dump_cmd => [
            'pg_dump', '--no-sync',
            '--file' => "$tempdir/defaults.sql",
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -364,6 +385,7 @@ my %pgdump_runs = (
        dump_cmd => [
            'pg_dump', '--no-sync',
            '--file' => "$tempdir/defaults_no_public.sql",
+           '--with-statistics',
            'regress_pg_dump_test',
        ],
    },
@@ -373,6 +395,7 @@ my %pgdump_runs = (
            'pg_dump', '--no-sync',
            '--clean',
            '--file' => "$tempdir/defaults_no_public_clean.sql",
+           '--with-statistics',
            'regress_pg_dump_test',
        ],
    },
@@ -381,6 +404,7 @@ my %pgdump_runs = (
        dump_cmd => [
            'pg_dump', '--no-sync',
            '--file' => "$tempdir/defaults_public_owner.sql",
+           '--with-statistics',
            'regress_public_owner',
        ],
    },
@@ -395,12 +419,14 @@ my %pgdump_runs = (
            'pg_dump',
            '--format' => 'custom',
            '--file' => "$tempdir/defaults_custom_format.dump",
+           '--with-statistics',
            'postgres',
        ],
        restore_cmd => [
            'pg_restore',
            '--format' => 'custom',
            '--file' => "$tempdir/defaults_custom_format.sql",
+           '--with-statistics',
            "$tempdir/defaults_custom_format.dump",
        ],
        command_like => {
@@ -425,12 +451,14 @@ my %pgdump_runs = (
            'pg_dump',
            '--format' => 'directory',
            '--file' => "$tempdir/defaults_dir_format",
+           '--with-statistics',
            'postgres',
        ],
        restore_cmd => [
            'pg_restore',
            '--format' => 'directory',
            '--file' => "$tempdir/defaults_dir_format.sql",
+           '--with-statistics',
            "$tempdir/defaults_dir_format",
        ],
        command_like => {
@@ -456,11 +484,13 @@ my %pgdump_runs = (
            '--format' => 'directory',
            '--jobs' => 2,
            '--file' => "$tempdir/defaults_parallel",
+           '--with-statistics',
            'postgres',
        ],
        restore_cmd => [
            'pg_restore',
            '--file' => "$tempdir/defaults_parallel.sql",
+           '--with-statistics',
            "$tempdir/defaults_parallel",
        ],
    },
@@ -472,12 +502,14 @@ my %pgdump_runs = (
            'pg_dump',
            '--format' => 'tar',
            '--file' => "$tempdir/defaults_tar_format.tar",
+           '--with-statistics',
            'postgres',
        ],
        restore_cmd => [
            'pg_restore',
            '--format' => 'tar',
            '--file' => "$tempdir/defaults_tar_format.sql",
+           '--with-statistics',
            "$tempdir/defaults_tar_format.tar",
        ],
    },
@@ -486,6 +518,7 @@ my %pgdump_runs = (
            'pg_dump', '--no-sync',
            '--file' => "$tempdir/exclude_dump_test_schema.sql",
            '--exclude-schema' => 'dump_test',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -494,6 +527,7 @@ my %pgdump_runs = (
            'pg_dump', '--no-sync',
            '--file' => "$tempdir/exclude_test_table.sql",
            '--exclude-table' => 'dump_test.test_table',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -502,6 +536,7 @@ my %pgdump_runs = (
            'pg_dump', '--no-sync',
            '--file' => "$tempdir/exclude_measurement.sql",
            '--exclude-table-and-children' => 'dump_test.measurement',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -511,6 +546,7 @@ my %pgdump_runs = (
            '--file' => "$tempdir/exclude_measurement_data.sql",
            '--exclude-table-data-and-children' => 'dump_test.measurement',
            '--no-unlogged-table-data',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -520,6 +556,7 @@ my %pgdump_runs = (
            '--file' => "$tempdir/exclude_test_table_data.sql",
            '--exclude-table-data' => 'dump_test.test_table',
            '--no-unlogged-table-data',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -538,6 +575,7 @@ my %pgdump_runs = (
            '--file' => "$tempdir/pg_dumpall_globals.sql",
            '--globals-only',
            '--no-sync',
+           '--with-statistics',
        ],
    },
    pg_dumpall_globals_clean => {
@@ -547,12 +585,14 @@ my %pgdump_runs = (
            '--globals-only',
            '--clean',
            '--no-sync',
+           '--with-statistics',
        ],
    },
    pg_dumpall_dbprivs => {
        dump_cmd => [
            'pg_dumpall', '--no-sync',
            '--file' => "$tempdir/pg_dumpall_dbprivs.sql",
+           '--with-statistics',
        ],
    },
    pg_dumpall_exclude => {
@@ -562,6 +602,7 @@ my %pgdump_runs = (
            '--file' => "$tempdir/pg_dumpall_exclude.sql",
            '--exclude-database' => '*dump_test*',
            '--no-sync',
+           '--with-statistics',
        ],
    },
    no_toast_compression => {
@@ -569,6 +610,7 @@ my %pgdump_runs = (
            'pg_dump', '--no-sync',
            '--file' => "$tempdir/no_toast_compression.sql",
            '--no-toast-compression',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -577,6 +619,7 @@ my %pgdump_runs = (
            'pg_dump', '--no-sync',
            '--file' => "$tempdir/no_large_objects.sql",
            '--no-large-objects',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -585,6 +628,7 @@ my %pgdump_runs = (
            'pg_dump', '--no-sync',
            '--file' => "$tempdir/no_policies.sql",
            '--no-policies',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -593,6 +637,7 @@ my %pgdump_runs = (
            'pg_dump', '--no-sync',
            '--file' => "$tempdir/no_privs.sql",
            '--no-privileges',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -601,6 +646,7 @@ my %pgdump_runs = (
            'pg_dump', '--no-sync',
            '--file' => "$tempdir/no_owner.sql",
            '--no-owner',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -609,6 +655,7 @@ my %pgdump_runs = (
            'pg_dump', '--no-sync',
            '--file' => "$tempdir/no_table_access_method.sql",
            '--no-table-access-method',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -617,6 +664,7 @@ my %pgdump_runs = (
            'pg_dump', '--no-sync',
            '--file' => "$tempdir/only_dump_test_schema.sql",
            '--schema' => 'dump_test',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -627,6 +675,7 @@ my %pgdump_runs = (
            '--table' => 'dump_test.test_table',
            '--lock-wait-timeout' =>
              (1000 * $PostgreSQL::Test::Utils::timeout_default),
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -637,6 +686,7 @@ my %pgdump_runs = (
            '--table-and-children' => 'dump_test.measurement',
            '--lock-wait-timeout' =>
              (1000 * $PostgreSQL::Test::Utils::timeout_default),
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -646,6 +696,7 @@ my %pgdump_runs = (
            '--file' => "$tempdir/role.sql",
            '--role' => 'regress_dump_test_role',
            '--schema' => 'dump_test_second_schema',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -658,11 +709,13 @@ my %pgdump_runs = (
            '--file' => "$tempdir/role_parallel",
            '--role' => 'regress_dump_test_role',
            '--schema' => 'dump_test_second_schema',
+           '--with-statistics',
            'postgres',
        ],
        restore_cmd => [
            'pg_restore',
            '--file' => "$tempdir/role_parallel.sql",
+           '--with-statistics',
            "$tempdir/role_parallel",
        ],
    },
@@ -691,6 +744,7 @@ my %pgdump_runs = (
            'pg_dump', '--no-sync',
            '--file' => "$tempdir/section_pre_data.sql",
            '--section' => 'pre-data',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -699,6 +753,7 @@ my %pgdump_runs = (
            'pg_dump', '--no-sync',
            '--file' => "$tempdir/section_data.sql",
            '--section' => 'data',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -707,6 +762,7 @@ my %pgdump_runs = (
            'pg_dump', '--no-sync',
            '--file' => "$tempdir/section_post_data.sql",
            '--section' => 'post-data',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -717,6 +773,7 @@ my %pgdump_runs = (
            '--schema' => 'dump_test',
            '--large-objects',
            '--no-large-objects',
+           '--with-statistics',
            'postgres',
        ],
    },
@@ -732,6 +789,7 @@ my %pgdump_runs = (
            'pg_dump', '--no-sync',
            "--file=$tempdir/no_data_no_schema.sql", '--no-data',
            '--no-schema', 'postgres',
+           '--with-statistics',
        ],
    },
    statistics_only => {
@@ -752,6 +810,7 @@ my %pgdump_runs = (
        dump_cmd => [
            'pg_dump', '--no-sync',
            "--file=$tempdir/no_schema.sql", '--no-schema',
+           '--with-statistics',
            'postgres',
        ],
    },);
index 23cb08e83476e88257e675819ee0c0bc18408d90..183f08ce1e86f0c9f9885985f328e91096faedb8 100644 (file)
@@ -58,7 +58,7 @@ generate_old_dump(void)
                           (user_opts.transfer_mode == TRANSFER_MODE_SWAP) ?
                           "" : "--sequence-data",
                           log_opts.verbose ? "--verbose" : "",
-                          user_opts.do_statistics ? "" : "--no-statistics",
+                          user_opts.do_statistics ? "--with-statistics" : "--no-statistics",
                           log_opts.dumpdir,
                           sql_file_name, escaped_connstr.data);