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:
parent
dfed0012bc
commit
90cbc63fd1
@ -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 */
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user