Have TRUNCATE advance the affected table's relfrozenxid to RecentXmin, to

avoid a later needless VACUUM for Xid-wraparound purposes.  We can do this
since the table is known to be left empty, so no Xid remains on it.

Per discussion.
This commit is contained in:
Alvaro Herrera 2007-05-16 17:28:20 +00:00
parent dfed0012bc
commit 90cbc63fd1
3 changed files with 16 additions and 8 deletions

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.282 2007/03/29 00:15:37 tgl Exp $ * $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.283 2007/05/16 17:28:20 alvherre Exp $
* *
* *
* INTERFACE ROUTINES * INTERFACE ROUTINES
@ -1188,9 +1188,12 @@ index_update_stats(Relation rel, bool hasindex, bool isprimary,
* setNewRelfilenode - assign a new relfilenode value to the relation * setNewRelfilenode - assign a new relfilenode value to the relation
* *
* Caller must already hold exclusive lock on the relation. * Caller must already hold exclusive lock on the relation.
*
* The relation is marked with relfrozenxid=freezeXid (InvalidTransactionId
* must be passed for indexes)
*/ */
void void
setNewRelfilenode(Relation relation) setNewRelfilenode(Relation relation, TransactionId freezeXid)
{ {
Oid newrelfilenode; Oid newrelfilenode;
RelFileNode newrnode; RelFileNode newrnode;
@ -1204,6 +1207,10 @@ setNewRelfilenode(Relation relation)
relation->rd_rel->relkind == RELKIND_INDEX); relation->rd_rel->relkind == RELKIND_INDEX);
/* Can't change for shared tables or indexes */ /* Can't change for shared tables or indexes */
Assert(!relation->rd_rel->relisshared); Assert(!relation->rd_rel->relisshared);
/* Indexes must have Invalid frozenxid; other relations must not */
Assert((relation->rd_rel->relkind == RELKIND_INDEX &&
freezeXid == InvalidTransactionId) ||
TransactionIdIsNormal(freezeXid));
/* Allocate a new relfilenode */ /* Allocate a new relfilenode */
newrelfilenode = GetNewRelFileNode(relation->rd_rel->reltablespace, newrelfilenode = GetNewRelFileNode(relation->rd_rel->reltablespace,
@ -1241,6 +1248,7 @@ setNewRelfilenode(Relation relation)
rd_rel->relfilenode = newrelfilenode; rd_rel->relfilenode = newrelfilenode;
rd_rel->relpages = 0; /* it's empty until further notice */ rd_rel->relpages = 0; /* it's empty until further notice */
rd_rel->reltuples = 0; rd_rel->reltuples = 0;
rd_rel->relfrozenxid = freezeXid;
simple_heap_update(pg_class, &tuple->t_self, tuple); simple_heap_update(pg_class, &tuple->t_self, tuple);
CatalogUpdateIndexes(pg_class, tuple); CatalogUpdateIndexes(pg_class, tuple);
@ -1957,7 +1965,7 @@ reindex_index(Oid indexId)
/* /*
* We'll build a new physical relation for the index. * We'll build a new physical relation for the index.
*/ */
setNewRelfilenode(iRel); setNewRelfilenode(iRel, InvalidTransactionId);
} }
/* Initialize the index and rebuild */ /* Initialize the index and rebuild */

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.223 2007/05/14 20:24:41 tgl Exp $ * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.224 2007/05/16 17:28:20 alvherre Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -616,7 +616,7 @@ ExecuteTruncate(TruncateStmt *stmt)
* the relfilenode value. The old storage file is scheduled for * the relfilenode value. The old storage file is scheduled for
* deletion at commit. * deletion at commit.
*/ */
setNewRelfilenode(rel); setNewRelfilenode(rel, RecentXmin);
heap_relid = RelationGetRelid(rel); heap_relid = RelationGetRelid(rel);
toast_relid = rel->rd_rel->reltoastrelid; toast_relid = rel->rd_rel->reltoastrelid;
@ -629,7 +629,7 @@ ExecuteTruncate(TruncateStmt *stmt)
if (OidIsValid(toast_relid)) if (OidIsValid(toast_relid))
{ {
rel = relation_open(toast_relid, AccessExclusiveLock); rel = relation_open(toast_relid, AccessExclusiveLock);
setNewRelfilenode(rel); setNewRelfilenode(rel, RecentXmin);
heap_close(rel, NoLock); heap_close(rel, NoLock);
} }

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/catalog/index.h,v 1.73 2007/01/09 02:14:15 tgl Exp $ * $PostgreSQL: pgsql/src/include/catalog/index.h,v 1.74 2007/05/16 17:28:20 alvherre Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -53,7 +53,7 @@ extern void FormIndexDatum(IndexInfo *indexInfo,
Datum *values, Datum *values,
bool *isnull); bool *isnull);
extern void setNewRelfilenode(Relation relation); extern void setNewRelfilenode(Relation relation, TransactionId freezeXid);
extern void index_build(Relation heapRelation, extern void index_build(Relation heapRelation,
Relation indexRelation, Relation indexRelation,