From 8a59f336bbb8d6829e88c89896472b497d809606 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu, 19 Jul 2001 21:25:37 +0000
Subject: [PATCH] Minor performance improvement in MultiRecordFreeSpace.

---
 src/backend/storage/freespace/freespace.c | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/backend/storage/freespace/freespace.c b/src/backend/storage/freespace/freespace.c
index a7866745f82..fec9f594a61 100644
--- a/src/backend/storage/freespace/freespace.c
+++ b/src/backend/storage/freespace/freespace.c
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/storage/freespace/freespace.c,v 1.3 2001/07/02 20:50:46 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/storage/freespace/freespace.c,v 1.4 2001/07/19 21:25:37 tgl Exp $
  *
  *
  * NOTES:
@@ -419,9 +419,23 @@ MultiRecordFreeSpace(RelFileNode *rel,
 		 *
 		 * XXX we could probably be smarter about this than doing it
 		 * completely separately for each one.  FIXME later.
+		 *
+		 * One thing we can do is short-circuit the process entirely if
+		 * a page (a) has too little free space to be recorded, and (b)
+		 * is within the minPage..maxPage range --- then we deleted any
+		 * old entry above, and we aren't going to make a new one.
+		 * This is particularly useful since in most cases, all the passed
+		 * pages will in fact be in the minPage..maxPage range.
 		 */
 		for (i = 0; i < nPages; i++)
-			fsm_record_free_space(fsmrel, pages[i], spaceAvail[i]);
+		{
+			BlockNumber	page = pages[i];
+			Size		avail = spaceAvail[i];
+
+			if (avail >= fsmrel->threshold ||
+				page < minPage || page > maxPage)
+				fsm_record_free_space(fsmrel, page, avail);
+		}
 	}
 	SpinRelease(FreeSpaceLock);
 }
-- 
GitLab