summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2008-12-08 15:44:54 +0000
committerTom Lane2008-12-08 15:44:54 +0000
commit2328fc5095f2d57f9eede51151d740a8df3f61ce (patch)
tree7d63eeb62fb9c553c354f5398a4d1e09d140c194
parentf40cbece317327441a4807fa3b42d6ef41ffc2fb (diff)
Teach pgstat_vacuum_stat to not bother scanning pg_proc in the common case
where no function stats entries exist. Partial response to Pavel's observation that small VACUUM operations are noticeably slower in CVS HEAD than 8.3.
-rw-r--r--src/backend/postmaster/pgstat.c69
1 files changed, 37 insertions, 32 deletions
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index 51c9fb4475..0b8e69da58 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -967,55 +967,60 @@ pgstat_vacuum_stat(void)
hash_destroy(htab);
/*
- * Now repeat the above steps for functions.
+ * Now repeat the above steps for functions. However, we needn't bother
+ * in the common case where no function stats are being collected.
*/
- htab = pgstat_collect_oids(ProcedureRelationId);
+ if (dbentry->functions != NULL &&
+ hash_get_num_entries(dbentry->functions) > 0)
+ {
+ htab = pgstat_collect_oids(ProcedureRelationId);
- pgstat_setheader(&f_msg.m_hdr, PGSTAT_MTYPE_FUNCPURGE);
- f_msg.m_databaseid = MyDatabaseId;
- f_msg.m_nentries = 0;
+ pgstat_setheader(&f_msg.m_hdr, PGSTAT_MTYPE_FUNCPURGE);
+ f_msg.m_databaseid = MyDatabaseId;
+ f_msg.m_nentries = 0;
- hash_seq_init(&hstat, dbentry->functions);
- while ((funcentry = (PgStat_StatFuncEntry *) hash_seq_search(&hstat)) != NULL)
- {
- Oid funcid = funcentry->functionid;
+ hash_seq_init(&hstat, dbentry->functions);
+ while ((funcentry = (PgStat_StatFuncEntry *) hash_seq_search(&hstat)) != NULL)
+ {
+ Oid funcid = funcentry->functionid;
- CHECK_FOR_INTERRUPTS();
+ CHECK_FOR_INTERRUPTS();
- if (hash_search(htab, (void *) &funcid, HASH_FIND, NULL) != NULL)
- continue;
+ if (hash_search(htab, (void *) &funcid, HASH_FIND, NULL) != NULL)
+ continue;
- /*
- * Not there, so add this function's Oid to the message
- */
- f_msg.m_functionid[f_msg.m_nentries++] = funcid;
+ /*
+ * Not there, so add this function's Oid to the message
+ */
+ f_msg.m_functionid[f_msg.m_nentries++] = funcid;
+
+ /*
+ * If the message is full, send it out and reinitialize to empty
+ */
+ if (f_msg.m_nentries >= PGSTAT_NUM_FUNCPURGE)
+ {
+ len = offsetof(PgStat_MsgFuncpurge, m_functionid[0])
+ +f_msg.m_nentries * sizeof(Oid);
+
+ pgstat_send(&f_msg, len);
+
+ f_msg.m_nentries = 0;
+ }
+ }
/*
- * If the message is full, send it out and reinitialize to empty
+ * Send the rest
*/
- if (f_msg.m_nentries >= PGSTAT_NUM_FUNCPURGE)
+ if (f_msg.m_nentries > 0)
{
len = offsetof(PgStat_MsgFuncpurge, m_functionid[0])
+f_msg.m_nentries * sizeof(Oid);
pgstat_send(&f_msg, len);
-
- f_msg.m_nentries = 0;
}
- }
- /*
- * Send the rest
- */
- if (f_msg.m_nentries > 0)
- {
- len = offsetof(PgStat_MsgFuncpurge, m_functionid[0])
- +f_msg.m_nentries * sizeof(Oid);
-
- pgstat_send(&f_msg, len);
+ hash_destroy(htab);
}
-
- hash_destroy(htab);
}