aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2010-10-20 00:55:16 +0000
committerBruce Momjian <bruce@momjian.us>2010-10-20 00:55:16 +0000
commit333b4a45f1d984bd7f32aecb1ba551feed088ec4 (patch)
tree78f563a2fb442e8af089555f972f802f9523fc80
parentad06db2610f479d559ee4a3b9e3241d40be07440 (diff)
downloadpostgresql-333b4a45f1d984bd7f32aecb1ba551feed088ec4.tar.gz
postgresql-333b4a45f1d984bd7f32aecb1ba551feed088ec4.zip
Cache most recent relfilenode lookups, for speed, after report of
pg_upgrade slowness for 150k tables.
-rw-r--r--contrib/pg_upgrade/info.c12
1 files changed, 11 insertions, 1 deletions
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 &&