Hi,

On 11/18/22 7:06 AM, Bharath Rupireddy wrote:
On Fri, Nov 18, 2022 at 10:32 AM Drouvot, Bertrand
<bertranddrouvot...@gmail.com> wrote:

Hi hackers,

Please find attached a patch proposal to avoid 2 calls to
pgstat_fetch_stat_tabentry_ext() in pgstat_fetch_stat_tabentry() in case
the relation is not a shared one and no statistics are found.

Thanks Andres for the suggestion done in [1].

[1]:
https://www.postgresql.org/message-id/20221116201202.3k74ajawyom2c3eq%40awork3.anarazel.de

+1. The patch LGTM.

Thanks for looking at it!

However, I have a suggestion to simplify it
further by getting rid of the local variable tabentry and just
returning pgstat_fetch_stat_tabentry_ext(IsSharedRelation(relid),
relid);. Furthermore, the pgstat_fetch_stat_tabentry() can just be a
static inline function.
Good point. While at it, why not completely get rid of pgstat_fetch_stat_tabentry_ext(), like in v2 the attached?

Regards,

--
Bertrand Drouvot
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com
diff --git a/src/backend/postmaster/autovacuum.c 
b/src/backend/postmaster/autovacuum.c
index 601834d4b4..fde8458f5e 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2101,8 +2101,8 @@ do_autovacuum(void)
 
                /* Fetch reloptions and the pgstat entry for this table */
                relopts = extract_autovac_opts(tuple, pg_class_desc);
-               tabentry = 
pgstat_fetch_stat_tabentry_ext(classForm->relisshared,
-                                                                               
                  relid);
+               tabentry = pgstat_fetch_stat_tabentry(classForm->relisshared,
+                                                                               
          relid);
 
                /* Check if it needs vacuum or analyze */
                relation_needs_vacanalyze(relid, relopts, classForm, tabentry,
@@ -2185,8 +2185,8 @@ do_autovacuum(void)
                }
 
                /* Fetch the pgstat entry for this table */
-               tabentry = 
pgstat_fetch_stat_tabentry_ext(classForm->relisshared,
-                                                                               
                  relid);
+               tabentry = pgstat_fetch_stat_tabentry(classForm->relisshared,
+                                                                               
          relid);
 
                relation_needs_vacanalyze(relid, relopts, classForm, tabentry,
                                                                  
effective_multixact_freeze_max_age,
@@ -2913,8 +2913,8 @@ recheck_relation_needs_vacanalyze(Oid relid,
        PgStat_StatTabEntry *tabentry;
 
        /* fetch the pgstat table entry */
-       tabentry = pgstat_fetch_stat_tabentry_ext(classForm->relisshared,
-                                                                               
          relid);
+       tabentry = pgstat_fetch_stat_tabentry(classForm->relisshared,
+                                                                               
  relid);
 
        relation_needs_vacanalyze(relid, avopts, classForm, tabentry,
                                                          
effective_multixact_freeze_max_age,
diff --git a/src/backend/utils/activity/pgstat_relation.c 
b/src/backend/utils/activity/pgstat_relation.c
index 55a355f583..266fa0c15e 100644
--- a/src/backend/utils/activity/pgstat_relation.c
+++ b/src/backend/utils/activity/pgstat_relation.c
@@ -61,8 +61,8 @@ pgstat_copy_relation_stats(Relation dst, Relation src)
        PgStatShared_Relation *dstshstats;
        PgStat_EntryRef *dst_ref;
 
-       srcstats = pgstat_fetch_stat_tabentry_ext(src->rd_rel->relisshared,
-                                                                               
          RelationGetRelid(src));
+       srcstats = pgstat_fetch_stat_tabentry(src->rd_rel->relisshared,
+                                                                               
  RelationGetRelid(src));
        if (!srcstats)
                return;
 
@@ -435,27 +435,7 @@ pgstat_update_heap_dead_tuples(Relation rel, int delta)
  * caller is better off to report ZERO instead.
  */
 PgStat_StatTabEntry *
-pgstat_fetch_stat_tabentry(Oid relid)
-{
-       PgStat_StatTabEntry *tabentry;
-
-       tabentry = pgstat_fetch_stat_tabentry_ext(false, relid);
-       if (tabentry != NULL)
-               return tabentry;
-
-       /*
-        * If we didn't find it, maybe it's a shared table.
-        */
-       tabentry = pgstat_fetch_stat_tabentry_ext(true, relid);
-       return tabentry;
-}
-
-/*
- * More efficient version of pgstat_fetch_stat_tabentry(), allowing to specify
- * whether the to-be-accessed table is a shared relation or not.
- */
-PgStat_StatTabEntry *
-pgstat_fetch_stat_tabentry_ext(bool shared, Oid reloid)
+pgstat_fetch_stat_tabentry(bool shared, Oid reloid)
 {
        Oid                     dboid = (shared ? InvalidOid : MyDatabaseId);
 
diff --git a/src/backend/utils/adt/pgstatfuncs.c 
b/src/backend/utils/adt/pgstatfuncs.c
index ae3365d917..8eed606702 100644
--- a/src/backend/utils/adt/pgstatfuncs.c
+++ b/src/backend/utils/adt/pgstatfuncs.c
@@ -31,6 +31,7 @@
 #include "utils/builtins.h"
 #include "utils/inet.h"
 #include "utils/timestamp.h"
+#include "catalog/catalog.h"
 
 #define UINT32_ACCESS_ONCE(var)                 ((uint32)(*((volatile uint32 
*)&(var))))
 
@@ -43,7 +44,7 @@ pg_stat_get_numscans(PG_FUNCTION_ARGS)
        int64           result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = (int64) (tabentry->numscans);
@@ -59,7 +60,7 @@ pg_stat_get_lastscan(PG_FUNCTION_ARGS)
        TimestampTz result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = tabentry->lastscan;
@@ -78,7 +79,7 @@ pg_stat_get_tuples_returned(PG_FUNCTION_ARGS)
        int64           result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = (int64) (tabentry->tuples_returned);
@@ -94,7 +95,7 @@ pg_stat_get_tuples_fetched(PG_FUNCTION_ARGS)
        int64           result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = (int64) (tabentry->tuples_fetched);
@@ -110,7 +111,7 @@ pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS)
        int64           result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = (int64) (tabentry->tuples_inserted);
@@ -126,7 +127,7 @@ pg_stat_get_tuples_updated(PG_FUNCTION_ARGS)
        int64           result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = (int64) (tabentry->tuples_updated);
@@ -142,7 +143,7 @@ pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS)
        int64           result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = (int64) (tabentry->tuples_deleted);
@@ -158,7 +159,7 @@ pg_stat_get_tuples_hot_updated(PG_FUNCTION_ARGS)
        int64           result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = (int64) (tabentry->tuples_hot_updated);
@@ -174,7 +175,7 @@ pg_stat_get_live_tuples(PG_FUNCTION_ARGS)
        int64           result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = (int64) (tabentry->n_live_tuples);
@@ -190,7 +191,7 @@ pg_stat_get_dead_tuples(PG_FUNCTION_ARGS)
        int64           result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = (int64) (tabentry->n_dead_tuples);
@@ -206,7 +207,7 @@ pg_stat_get_mod_since_analyze(PG_FUNCTION_ARGS)
        int64           result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = (int64) (tabentry->changes_since_analyze);
@@ -222,7 +223,7 @@ pg_stat_get_ins_since_vacuum(PG_FUNCTION_ARGS)
        int64           result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = (int64) (tabentry->inserts_since_vacuum);
@@ -238,7 +239,7 @@ pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS)
        int64           result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = (int64) (tabentry->blocks_fetched);
@@ -254,7 +255,7 @@ pg_stat_get_blocks_hit(PG_FUNCTION_ARGS)
        int64           result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = (int64) (tabentry->blocks_hit);
@@ -269,7 +270,7 @@ pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS)
        TimestampTz result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = tabentry->vacuum_timestamp;
@@ -287,7 +288,7 @@ pg_stat_get_last_autovacuum_time(PG_FUNCTION_ARGS)
        TimestampTz result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = tabentry->autovac_vacuum_timestamp;
@@ -305,7 +306,7 @@ pg_stat_get_last_analyze_time(PG_FUNCTION_ARGS)
        TimestampTz result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = tabentry->analyze_timestamp;
@@ -323,7 +324,7 @@ pg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS)
        TimestampTz result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = tabentry->autovac_analyze_timestamp;
@@ -341,7 +342,7 @@ pg_stat_get_vacuum_count(PG_FUNCTION_ARGS)
        int64           result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = (int64) (tabentry->vacuum_count);
@@ -356,7 +357,7 @@ pg_stat_get_autovacuum_count(PG_FUNCTION_ARGS)
        int64           result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = (int64) (tabentry->autovac_vacuum_count);
@@ -371,7 +372,7 @@ pg_stat_get_analyze_count(PG_FUNCTION_ARGS)
        int64           result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = (int64) (tabentry->analyze_count);
@@ -386,7 +387,7 @@ pg_stat_get_autoanalyze_count(PG_FUNCTION_ARGS)
        int64           result;
        PgStat_StatTabEntry *tabentry;
 
-       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+       if ((tabentry = pgstat_fetch_stat_tabentry(IsSharedRelation(relid), 
relid)) == NULL)
                result = 0;
        else
                result = (int64) (tabentry->autovac_analyze_count);
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 9e2ce6f011..10ae025988 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -569,9 +569,8 @@ extern void pgstat_twophase_postcommit(TransactionId xid, 
uint16 info,
 extern void pgstat_twophase_postabort(TransactionId xid, uint16 info,
                                                                          void 
*recdata, uint32 len);
 
-extern PgStat_StatTabEntry *pgstat_fetch_stat_tabentry(Oid relid);
-extern PgStat_StatTabEntry *pgstat_fetch_stat_tabentry_ext(bool shared,
-                                                                               
                                   Oid reloid);
+extern PgStat_StatTabEntry *pgstat_fetch_stat_tabentry(bool shared,
+                                                                               
                           Oid reloid);
 extern PgStat_TableStatus *find_tabstat_entry(Oid rel_id);
 
 

Reply via email to