Teach pgstat_vacuum_stat to not bother scanning pg_proc in the common case
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 8 Dec 2008 15:44:54 +0000 (15:44 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 8 Dec 2008 15:44:54 +0000 (15:44 +0000)
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.

src/backend/postmaster/pgstat.c

index 85c4313cca31d4aab652fbc49d527fe8951336f9..0526d169f7e16029b01a2dd186ef614485ae55c9 100644 (file)
@@ -13,7 +13,7 @@
  *
  * Copyright (c) 2001-2008, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.184 2008/11/04 11:04:06 petere Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.185 2008/12/08 15:44:54 tgl Exp $
  * ----------
  */
 #include "postgres.h"
@@ -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);
 }