From 333b4a45f1d984bd7f32aecb1ba551feed088ec4 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Wed, 20 Oct 2010 00:55:16 +0000
Subject: [PATCH] Cache most recent relfilenode lookups, for speed, after
 report of pg_upgrade slowness for 150k tables.

---
 contrib/pg_upgrade/info.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/contrib/pg_upgrade/info.c b/contrib/pg_upgrade/info.c
index a8d0bddc191..946e6ccb6ba 100644
--- a/contrib/pg_upgrade/info.c
+++ b/contrib/pg_upgrade/info.c
@@ -423,11 +423,21 @@ relarr_lookup_rel(RelInfoArr *rel_arr,
 				  const char *nspname, const char *relname,
 				  Cluster whichCluster)
 {
-	int			relnum;
+	static int			relnum = 0;
 
 	if (!rel_arr || !relname)
 		return NULL;
 
+	/* Test most recent lookup first, for speed */
+	if (strcmp(rel_arr->rels[relnum].nspname, nspname) == 0 &&
+		strcmp(rel_arr->rels[relnum].relname, relname) == 0)
+		return &rel_arr->rels[relnum];
+
+	if (relnum + 1 < rel_arr->nrels &&
+		strcmp(rel_arr->rels[relnum + 1].nspname, nspname) == 0 &&
+		strcmp(rel_arr->rels[relnum + 1].relname, relname) == 0)
+		return &rel_arr->rels[relnum + 1];
+	
 	for (relnum = 0; relnum < rel_arr->nrels; relnum++)
 	{
 		if (strcmp(rel_arr->rels[relnum].nspname, nspname) == 0 &&
-- 
GitLab