Skip to content

Commit 4e0b63b

Browse files
committed
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.
1 parent bd33aca commit 4e0b63b

File tree

1 file changed

+38
-33
lines changed

1 file changed

+38
-33
lines changed

src/backend/postmaster/pgstat.c

Lines changed: 38 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*
1414
* Copyright (c) 2001-2008, PostgreSQL Global Development Group
1515
*
16-
* $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.184 2008/11/04 11:04:06 petere Exp $
16+
* $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.185 2008/12/08 15:44:54 tgl Exp $
1717
* ----------
1818
*/
1919
#include "postgres.h"
@@ -967,55 +967,60 @@ pgstat_vacuum_stat(void)
967967
hash_destroy(htab);
968968

969969
/*
970-
* Now repeat the above steps for functions.
970+
* Now repeat the above steps for functions. However, we needn't bother
971+
* in the common case where no function stats are being collected.
971972
*/
972-
htab = pgstat_collect_oids(ProcedureRelationId);
973+
if (dbentry->functions != NULL &&
974+
hash_get_num_entries(dbentry->functions) > 0)
975+
{
976+
htab = pgstat_collect_oids(ProcedureRelationId);
973977

974-
pgstat_setheader(&f_msg.m_hdr, PGSTAT_MTYPE_FUNCPURGE);
975-
f_msg.m_databaseid = MyDatabaseId;
976-
f_msg.m_nentries = 0;
978+
pgstat_setheader(&f_msg.m_hdr, PGSTAT_MTYPE_FUNCPURGE);
979+
f_msg.m_databaseid = MyDatabaseId;
980+
f_msg.m_nentries = 0;
977981

978-
hash_seq_init(&hstat, dbentry->functions);
979-
while ((funcentry = (PgStat_StatFuncEntry *) hash_seq_search(&hstat)) != NULL)
980-
{
981-
Oid funcid = funcentry->functionid;
982+
hash_seq_init(&hstat, dbentry->functions);
983+
while ((funcentry = (PgStat_StatFuncEntry *) hash_seq_search(&hstat)) != NULL)
984+
{
985+
Oid funcid = funcentry->functionid;
982986

983-
CHECK_FOR_INTERRUPTS();
987+
CHECK_FOR_INTERRUPTS();
984988

985-
if (hash_search(htab, (void *) &funcid, HASH_FIND, NULL) != NULL)
986-
continue;
989+
if (hash_search(htab, (void *) &funcid, HASH_FIND, NULL) != NULL)
990+
continue;
987991

988-
/*
989-
* Not there, so add this function's Oid to the message
990-
*/
991-
f_msg.m_functionid[f_msg.m_nentries++] = funcid;
992+
/*
993+
* Not there, so add this function's Oid to the message
994+
*/
995+
f_msg.m_functionid[f_msg.m_nentries++] = funcid;
996+
997+
/*
998+
* If the message is full, send it out and reinitialize to empty
999+
*/
1000+
if (f_msg.m_nentries >= PGSTAT_NUM_FUNCPURGE)
1001+
{
1002+
len = offsetof(PgStat_MsgFuncpurge, m_functionid[0])
1003+
+f_msg.m_nentries * sizeof(Oid);
1004+
1005+
pgstat_send(&f_msg, len);
1006+
1007+
f_msg.m_nentries = 0;
1008+
}
1009+
}
9921010

9931011
/*
994-
* If the message is full, send it out and reinitialize to empty
1012+
* Send the rest
9951013
*/
996-
if (f_msg.m_nentries >= PGSTAT_NUM_FUNCPURGE)
1014+
if (f_msg.m_nentries > 0)
9971015
{
9981016
len = offsetof(PgStat_MsgFuncpurge, m_functionid[0])
9991017
+f_msg.m_nentries * sizeof(Oid);
10001018

10011019
pgstat_send(&f_msg, len);
1002-
1003-
f_msg.m_nentries = 0;
10041020
}
1005-
}
10061021

1007-
/*
1008-
* Send the rest
1009-
*/
1010-
if (f_msg.m_nentries > 0)
1011-
{
1012-
len = offsetof(PgStat_MsgFuncpurge, m_functionid[0])
1013-
+f_msg.m_nentries * sizeof(Oid);
1014-
1015-
pgstat_send(&f_msg, len);
1022+
hash_destroy(htab);
10161023
}
1017-
1018-
hash_destroy(htab);
10191024
}
10201025

10211026

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy