aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2003-01-07 01:19:12 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2003-01-07 01:19:12 +0000
commit973a210cce990134f63da12f8ca2d4d0718a103e (patch)
tree30db8be2100df01ae3a16a9657dae42f8e054aff /src
parentc9cf982038e11f9ce3b8fb5634cf49e6900f48b9 (diff)
downloadpostgresql-973a210cce990134f63da12f8ca2d4d0718a103e.tar.gz
postgresql-973a210cce990134f63da12f8ca2d4d0718a103e.zip
Tweak mdnblocks() to avoid doing lseek() on segments that it has
previously determined not to be the last segment of a relation. This reduces the expected cost to one seek, rather than one seek per segment. We can get away with this because truncation of a relation will cause a relcache flush and so the md.c file descriptor will be closed; when it is re-opened we will re-determine the last segment.
Diffstat (limited to 'src')
-rw-r--r--src/backend/storage/smgr/md.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c
index f8f82048f34..d67be96349e 100644
--- a/src/backend/storage/smgr/md.c
+++ b/src/backend/storage/smgr/md.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.93 2002/11/12 15:26:30 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.94 2003/01/07 01:19:12 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -569,6 +569,21 @@ mdnblocks(Relation reln)
#ifndef LET_OS_MANAGE_FILESIZE
segno = 0;
+
+ /*
+ * Skip through any segments that aren't the last one, to avoid redundant
+ * seeks on them. We have previously verified that these segments are
+ * exactly RELSEG_SIZE long, and it's useless to recheck that each time.
+ * (NOTE: this assumption could only be wrong if another backend has
+ * truncated the relation. We rely on higher code levels to handle that
+ * scenario by closing and re-opening the md fd.)
+ */
+ while (v->mdfd_chain != (MdfdVec *) NULL)
+ {
+ segno++;
+ v = v->mdfd_chain;
+ }
+
for (;;)
{
nblocks = _mdnblocks(v->mdfd_vfd, BLCKSZ);