Minor copy-editing for description of partial-table vacuuming.

This commit is contained in:
Tom Lane 2009-05-16 22:51:24 +00:00
parent 03a5ff0d1a
commit 606f5d1763

View File

@ -1,4 +1,4 @@
<!-- $PostgreSQL: pgsql/doc/src/sgml/maintenance.sgml,v 1.93 2009/04/23 10:09:11 heikki Exp $ --> <!-- $PostgreSQL: pgsql/doc/src/sgml/maintenance.sgml,v 1.94 2009/05/16 22:51:24 tgl Exp $ -->
<chapter id="maintenance"> <chapter id="maintenance">
<title>Routine Database Maintenance Tasks</title> <title>Routine Database Maintenance Tasks</title>
@ -375,19 +375,7 @@
</para> </para>
<para> <para>
<command>VACUUM</> normally skips pages that don't have any dead row <xref linkend="guc-vacuum-freeze-min-age">
versions, but those pages might still have tuples with old XID values.
To replace them too, a scan of the whole table is needed.
<xref linkend="guc-vacuum-freeze-table-age"> controls when
<command>VACUUM</> does that: a whole table sweep is forced if
the table hasn't been fully scanned for <varname>vacuum_freeze_table_age</>
- <varname>vacuum_freeze_min_age</> transactions. Setting it to 0
makes <command>VACUUM</> to ignore the visibility map and always scan all
pages.
</para>
<para>
<xref linkend="guc-vacuum-freeze-min-age">
controls how old an XID value has to be before it's replaced with controls how old an XID value has to be before it's replaced with
<literal>FrozenXID</>. Larger values of this setting <literal>FrozenXID</>. Larger values of this setting
preserve transactional information longer, while smaller values increase preserve transactional information longer, while smaller values increase
@ -395,6 +383,19 @@
vacuumed again. vacuumed again.
</para> </para>
<para>
<command>VACUUM</> normally skips pages that don't have any dead row
versions, but those pages might still have row versions with old XID
values. To ensure all old XIDs have been replaced by
<literal>FrozenXID</>, a scan of the whole table is needed.
<xref linkend="guc-vacuum-freeze-table-age"> controls when
<command>VACUUM</> does that: a whole table sweep is forced if
the table hasn't been fully scanned for <varname>vacuum_freeze_table_age</>
minus <varname>vacuum_freeze_min_age</> transactions. Setting it to 0
forces <command>VACUUM</> to always scan all pages, effectively ignoring
the visibility map.
</para>
<para> <para>
The maximum time that a table can go unvacuumed is two billion The maximum time that a table can go unvacuumed is two billion
transactions minus the <varname>vacuum_freeze_min_age</> that was used transactions minus the <varname>vacuum_freeze_min_age</> that was used
@ -423,9 +424,9 @@
</para> </para>
<para> <para>
The effective maximum for <varname>vacuum_table_age</> is 0.95 * The effective maximum for <varname>vacuum_freeze_table_age</> is 0.95 *
<varname>autovacuum_freeze_max_age</>; a setting higher than that will be <varname>autovacuum_freeze_max_age</>; a setting higher than that will be
capped to that maximum. A value higher than capped to the maximum. A value higher than
<varname>autovacuum_freeze_max_age</> wouldn't make sense because an <varname>autovacuum_freeze_max_age</> wouldn't make sense because an
anti-wraparound autovacuum would be triggered at that point anyway, and anti-wraparound autovacuum would be triggered at that point anyway, and
the 0.95 multiplier leaves some breathing room to run a manual the 0.95 multiplier leaves some breathing room to run a manual
@ -477,7 +478,7 @@
<structname>pg_database</>. In particular, <structname>pg_database</>. In particular,
the <structfield>relfrozenxid</> column of a table's the <structfield>relfrozenxid</> column of a table's
<structname>pg_class</> row contains the freeze cutoff XID that was used <structname>pg_class</> row contains the freeze cutoff XID that was used
by the last <command>VACUUM</> for that table. All normal by the last whole-table <command>VACUUM</> for that table. All normal
XIDs older than this cutoff XID are guaranteed to have been replaced by XIDs older than this cutoff XID are guaranteed to have been replaced by
<literal>FrozenXID</> within the table. Similarly, <literal>FrozenXID</> within the table. Similarly,
the <structfield>datfrozenxid</> column of a database's the <structfield>datfrozenxid</> column of a database's
@ -493,12 +494,16 @@ SELECT datname, age(datfrozenxid) FROM pg_database;
</programlisting> </programlisting>
The <literal>age</> column measures the number of transactions from the The <literal>age</> column measures the number of transactions from the
cutoff XID to the current transaction's XID. <command>VACUUM</> normally cutoff XID to the current transaction's XID.
only scans pages that have been modified since last vacuum, but </para>
<para>
<command>VACUUM</> normally
only scans pages that have been modified since the last vacuum, but
<structfield>relfrozenxid</> can only be advanced when the whole table is <structfield>relfrozenxid</> can only be advanced when the whole table is
scanned. The whole table is scanned when <structfield>relfrozenxid</> is scanned. The whole table is scanned when <structfield>relfrozenxid</> is
more than <varname>vacuum_freeze_table_age</> transactions old, if more than <varname>vacuum_freeze_table_age</> transactions old, when the
<command>VACUUM FREEZE</> command is used, or if all pages happen to <command>VACUUM FREEZE</> command is used, or when all pages happen to
require vacuuming to remove dead row versions. When <command>VACUUM</> require vacuuming to remove dead row versions. When <command>VACUUM</>
scans the whole table, after it's finished <literal>age(relfrozenxid)</> scans the whole table, after it's finished <literal>age(relfrozenxid)</>
should be a little more than the <varname>vacuum_freeze_min_age</> setting should be a little more than the <varname>vacuum_freeze_min_age</> setting
@ -571,14 +576,14 @@ HINT: Stop the postmaster and use a standalone backend to VACUUM in "mydb".
There is a persistent daemon process, called the There is a persistent daemon process, called the
<firstterm>autovacuum launcher</firstterm>, which is in charge of starting <firstterm>autovacuum launcher</firstterm>, which is in charge of starting
<firstterm>autovacuum worker</firstterm> processes for all databases. The <firstterm>autovacuum worker</firstterm> processes for all databases. The
launcher will distribute the work across time, but attempt to start one launcher will distribute the work across time, attempting to start one
worker on each database every <xref linkend="guc-autovacuum-naptime"> worker on each database every <xref linkend="guc-autovacuum-naptime">
seconds. One worker will be launched for each database, with a maximum seconds. One worker will be launched for each database, with a maximum
of <xref linkend="guc-autovacuum-max-workers"> processes running at the of <xref linkend="guc-autovacuum-max-workers"> processes running at the
same time. If there are more than same time. If there are more than
<xref linkend="guc-autovacuum-max-workers"> databases to be processed, <xref linkend="guc-autovacuum-max-workers"> databases to be processed,
the next database will be processed as soon as the first worker finishes. the next database will be processed as soon as the first worker finishes.
The worker processes will check each table within its database and Each worker process will check each table within its database and
execute <command>VACUUM</> and/or <command>ANALYZE</> as needed. execute <command>VACUUM</> and/or <command>ANALYZE</> as needed.
</para> </para>
@ -621,7 +626,7 @@ vacuum threshold = vacuum base threshold + vacuum scale factor * number of tuple
than <varname>vacuum_freeze_table_age</> transactions old, the whole than <varname>vacuum_freeze_table_age</> transactions old, the whole
table is scanned to freeze old tuples and advance table is scanned to freeze old tuples and advance
<structfield>relfrozenxid</>, otherwise only pages that have been modified <structfield>relfrozenxid</>, otherwise only pages that have been modified
since last vacuum are vacuumed. since the last vacuum are scanned.
</para> </para>
<para> <para>
@ -636,7 +641,7 @@ analyze threshold = analyze base threshold + analyze scale factor * number of tu
<para> <para>
The default thresholds and scale factors are taken from The default thresholds and scale factors are taken from
<filename>postgresql.conf</filename>, but it is possible to override them <filename>postgresql.conf</filename>, but it is possible to override them
on a table-by-table basis; see on a table-by-table basis; see
<xref linkend="sql-createtable-storage-parameters" <xref linkend="sql-createtable-storage-parameters"
endterm="sql-createtable-storage-parameters-title"> for more information. endterm="sql-createtable-storage-parameters-title"> for more information.
If a setting If a setting
@ -806,7 +811,7 @@ pg_ctl start | rotatelogs /var/log/pgsql_log 86400
just when you need them the most. Also, on <productname>Linux</>, just when you need them the most. Also, on <productname>Linux</>,
<application>syslog</> will sync each message to disk, yielding poor <application>syslog</> will sync each message to disk, yielding poor
performance. (You can use a <literal>-</> at the start of the file name performance. (You can use a <literal>-</> at the start of the file name
in the <application>syslog</> configuration file to disable this behavior.) in the <application>syslog</> configuration file to disable syncing.)
</para> </para>
<para> <para>