From dab52ab13d3d3cce26e9bcc3193eb285c195d430 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 25 Nov 2005 04:24:48 +0000 Subject: Improve ExecStoreTuple to be smarter about replacing the contents of a TupleTableSlot: instead of calling ExecClearTuple, inline the needed operations, so that we can avoid redundant steps. In particular, when the old and new tuples are both on the same disk page, avoid releasing and re-acquiring the buffer pin --- this saves work in both the bufmgr and ResourceOwner modules. To make this improvement actually useful, partially revert a change I made on 2004-04-21 that caused SeqNext et al to call ExecClearTuple before ExecStoreTuple. The motivation for that, to avoid grabbing the BufMgrLock separately for releasing the old buffer and grabbing the new one, no longer applies. My profiling says that this saves about 5% of the CPU time for an all-in-memory seqscan. --- src/backend/executor/nodeTidscan.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) (limited to 'src/backend/executor/nodeTidscan.c') diff --git a/src/backend/executor/nodeTidscan.c b/src/backend/executor/nodeTidscan.c index c8708f5831..4b0775719e 100644 --- a/src/backend/executor/nodeTidscan.c +++ b/src/backend/executor/nodeTidscan.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeTidscan.c,v 1.43 2005/10/15 02:49:17 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeTidscan.c,v 1.44 2005/11/25 04:24:48 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -106,13 +106,6 @@ TidNext(TidScanState *node) slot = node->ss.ss_ScanTupleSlot; scanrelid = ((TidScan *) node->ss.ps.plan)->scan.scanrelid; - /* - * Clear any reference to the previously returned tuple. This doesn't - * offer any great performance benefit, but it keeps this code in sync - * with SeqNext and IndexNext. - */ - ExecClearTuple(slot); - /* * Check if we are evaluating PlanQual for tuple of this relation. * Additional checking is not good, but no other way for now. We could @@ -123,7 +116,7 @@ TidNext(TidScanState *node) estate->es_evTuple[scanrelid - 1] != NULL) { if (estate->es_evTupleNull[scanrelid - 1]) - return slot; /* return empty slot */ + return ExecClearTuple(slot); /* * XXX shouldn't we check here to make sure tuple matches TID list? In @@ -135,7 +128,7 @@ TidNext(TidScanState *node) /* Flag for the next call that no more tuples */ estate->es_evTupleNull[scanrelid - 1] = true; - return (slot); + return slot; } /* -- cgit v1.2.1