]> granicus.if.org Git - postgresql/commitdiff
Add vacuum and analyze counters to pg_stat_*_tables views.
authorMagnus Hagander <magnus@hagander.net>
Sat, 21 Aug 2010 10:59:17 +0000 (10:59 +0000)
committerMagnus Hagander <magnus@hagander.net>
Sat, 21 Aug 2010 10:59:17 +0000 (10:59 +0000)
doc/src/sgml/monitoring.sgml
src/backend/catalog/system_views.sql
src/backend/postmaster/pgstat.c
src/backend/utils/adt/pgstatfuncs.c
src/include/catalog/catversion.h
src/include/catalog/pg_proc.h
src/include/pgstat.h

index 9aacabaaaec89e6e0caf0aab7bd55daa9f21c8e6..d3ff36dfd1eeabf86ec9024429bbabde673c7697 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/monitoring.sgml,v 1.84 2010/08/17 04:37:20 petere Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/monitoring.sgml,v 1.85 2010/08/21 10:59:17 mha Exp $ -->
 
 <chapter id="monitoring">
  <title>Monitoring Database Activity</title>
 
 <chapter id="monitoring">
  <title>Monitoring Database Activity</title>
@@ -117,9 +117,9 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
    is a subsystem that supports collection and reporting of information about
    server activity.  Presently, the collector can count accesses to tables
    and indexes in both disk-block and individual-row terms.  It also tracks
    is a subsystem that supports collection and reporting of information about
    server activity.  Presently, the collector can count accesses to tables
    and indexes in both disk-block and individual-row terms.  It also tracks
-   the total number of rows in each table, and the last vacuum and analyze times
-   for each table.  It can also count calls to user-defined functions and
-   the total time spent in each one.
+   the total number of rows in each table, and information about vacuum and
+   analyze actions for each table.  It can also count calls to user-defined
+   functions and the total time spent in each one.
   </para>
 
   <para>
   </para>
 
   <para>
@@ -293,7 +293,11 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
       the last time the table was vacuumed manually,
       the last time it was vacuumed by the autovacuum daemon,
       the last time it was analyzed manually,
       the last time the table was vacuumed manually,
       the last time it was vacuumed by the autovacuum daemon,
       the last time it was analyzed manually,
-      and the last time it was analyzed by the autovacuum daemon.
+      the last time it was analyzed by the autovacuum daemon,
+      number of times it has been vacuumed manually,
+      number of times it has been vacuumed by the autovacuum daemon,
+      number of times it has been analyzed manually,
+      and the number of times it has been analyzed by the autovacuum daemon.
       </entry>
      </row>
 
       </entry>
      </row>
 
@@ -314,8 +318,8 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
       <entry>Similar to <structname>pg_stat_all_tables</>, but counts actions
       taken so far within the current transaction (which are <emphasis>not</>
       yet included in <structname>pg_stat_all_tables</> and related views).
       <entry>Similar to <structname>pg_stat_all_tables</>, but counts actions
       taken so far within the current transaction (which are <emphasis>not</>
       yet included in <structname>pg_stat_all_tables</> and related views).
-      The columns for numbers of live and dead rows and last-vacuum and
-      last-analyze times are not present in this view.</entry>
+      The columns for numbers of live and dead rows and vacuum and
+      analyze actions are not present in this view.</entry>
      </row>
 
      <row>
      </row>
 
      <row>
@@ -718,6 +722,38 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
       </entry>
      </row>
 
       </entry>
      </row>
 
+     <row>
+      <entry><literal><function>pg_stat_get_vacuum_count</function>(<type>oid</type>)</literal></entry>
+      <entry><type>bigint</type></entry>
+      <entry>
+       The number of times this table has been vacuumed manually
+      </entry>
+     </row>
+
+     <row>
+      <entry><literal><function>pg_stat_get_autovacuum_count</function>(<type>oid</type>)</literal></entry>
+      <entry><type>bigint</type></entry>
+      <entry>
+       The number of times this table has been vacuumed by the autovacuum daemon
+      </entry>
+     </row>
+
+     <row>
+      <entry><literal><function>pg_stat_get_analyze_count</function>(<type>oid</type>)</literal></entry>
+      <entry><type>bigint</type></entry>
+      <entry>
+       The number of times this table has been analyzed manually
+      </entry>
+     </row>
+
+     <row>
+      <entry><literal><function>pg_stat_get_autoanalyze_count</function>(<type>oid</type>)</literal></entry>
+      <entry><type>bigint</type></entry>
+      <entry>
+       The number of times this table has been analyzed by the autovacuum daemon
+      </entry>
+     </row>
+
      <row>
       <entry><literal><function>pg_stat_get_xact_numscans</function>(<type>oid</type>)</literal></entry>
       <entry><type>bigint</type></entry>
      <row>
       <entry><literal><function>pg_stat_get_xact_numscans</function>(<type>oid</type>)</literal></entry>
       <entry><type>bigint</type></entry>
index 217e597513b00666047651509f14bb83cb26b9b6..a1604802892c62a3527fa9be7bafe9f6b92b2cb9 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1996-2010, PostgreSQL Global Development Group
  *
  *
  * Copyright (c) 1996-2010, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/backend/catalog/system_views.sql,v 1.67 2010/08/08 16:27:03 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/catalog/system_views.sql,v 1.68 2010/08/21 10:59:17 mha Exp $
  */
 
 CREATE VIEW pg_roles AS 
  */
 
 CREATE VIEW pg_roles AS 
@@ -201,7 +201,11 @@ CREATE VIEW pg_stat_all_tables AS
             pg_stat_get_last_vacuum_time(C.oid) as last_vacuum,
             pg_stat_get_last_autovacuum_time(C.oid) as last_autovacuum,
             pg_stat_get_last_analyze_time(C.oid) as last_analyze,
             pg_stat_get_last_vacuum_time(C.oid) as last_vacuum,
             pg_stat_get_last_autovacuum_time(C.oid) as last_autovacuum,
             pg_stat_get_last_analyze_time(C.oid) as last_analyze,
-            pg_stat_get_last_autoanalyze_time(C.oid) as last_autoanalyze
+            pg_stat_get_last_autoanalyze_time(C.oid) as last_autoanalyze,
+            pg_stat_get_vacuum_count(C.oid) AS vacuum_count,
+            pg_stat_get_autovacuum_count(C.oid) AS autovacuum_count,
+            pg_stat_get_analyze_count(C.oid) AS analyze_count,
+            pg_stat_get_autoanalyze_count(C.oid) AS autoanalyze_count
     FROM pg_class C LEFT JOIN 
          pg_index I ON C.oid = I.indrelid 
          LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) 
     FROM pg_class C LEFT JOIN 
          pg_index I ON C.oid = I.indrelid 
          LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) 
index ae8db9e9deaf4bb3461c304dae3d0fec0431bb27..b1782da42370c53c672ef533a5ebff855113b8e3 100644 (file)
@@ -13,7 +13,7 @@
  *
  *     Copyright (c) 2001-2010, PostgreSQL Global Development Group
  *
  *
  *     Copyright (c) 2001-2010, PostgreSQL Global Development Group
  *
- *     $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.205 2010/08/08 16:27:03 tgl Exp $
+ *     $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.206 2010/08/21 10:59:17 mha Exp $
  * ----------
  */
 #include "postgres.h"
  * ----------
  */
 #include "postgres.h"
@@ -3192,6 +3192,10 @@ pgstat_get_tab_entry(PgStat_StatDBEntry *dbentry, Oid tableoid, bool create)
                result->autovac_vacuum_timestamp = 0;
                result->analyze_timestamp = 0;
                result->autovac_analyze_timestamp = 0;
                result->autovac_vacuum_timestamp = 0;
                result->analyze_timestamp = 0;
                result->autovac_analyze_timestamp = 0;
+               result->vacuum_count = 0;
+               result->autovac_vacuum_count = 0;
+               result->analyze_count = 0;
+               result->autovac_analyze_count = 0;
        }
 
        return result;
        }
 
        return result;
@@ -4114,9 +4118,15 @@ pgstat_recv_vacuum(PgStat_MsgVacuum *msg, int len)
        tabentry->n_dead_tuples = 0;
 
        if (msg->m_autovacuum)
        tabentry->n_dead_tuples = 0;
 
        if (msg->m_autovacuum)
+       {
                tabentry->autovac_vacuum_timestamp = msg->m_vacuumtime;
                tabentry->autovac_vacuum_timestamp = msg->m_vacuumtime;
+               tabentry->autovac_vacuum_count++;
+       }
        else
        else
+       {
                tabentry->vacuum_timestamp = msg->m_vacuumtime;
                tabentry->vacuum_timestamp = msg->m_vacuumtime;
+               tabentry->vacuum_count++;
+       }
 }
 
 /* ----------
 }
 
 /* ----------
@@ -4151,9 +4161,15 @@ pgstat_recv_analyze(PgStat_MsgAnalyze *msg, int len)
        tabentry->changes_since_analyze = 0;
 
        if (msg->m_autovacuum)
        tabentry->changes_since_analyze = 0;
 
        if (msg->m_autovacuum)
+       {
                tabentry->autovac_analyze_timestamp = msg->m_analyzetime;
                tabentry->autovac_analyze_timestamp = msg->m_analyzetime;
+               tabentry->autovac_analyze_count++;
+       }
        else
        else
+       {
                tabentry->analyze_timestamp = msg->m_analyzetime;
                tabentry->analyze_timestamp = msg->m_analyzetime;
+               tabentry->analyze_count++;
+       }
 }
 
 
 }
 
 
index 77627dbdf362e006a2ef5bffb6639afcec85c7af..9432fc86c6ad546e3c7992147b3837332f5207a7 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.61 2010/08/08 16:27:04 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.62 2010/08/21 10:59:17 mha Exp $
  *
  *-------------------------------------------------------------------------
  */
  *
  *-------------------------------------------------------------------------
  */
@@ -38,6 +38,10 @@ extern Datum pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS);
 extern Datum pg_stat_get_last_autovacuum_time(PG_FUNCTION_ARGS);
 extern Datum pg_stat_get_last_analyze_time(PG_FUNCTION_ARGS);
 extern Datum pg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS);
 extern Datum pg_stat_get_last_autovacuum_time(PG_FUNCTION_ARGS);
 extern Datum pg_stat_get_last_analyze_time(PG_FUNCTION_ARGS);
 extern Datum pg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_vacuum_count(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_autovacuum_count(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_analyze_count(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_autoanalyze_count(PG_FUNCTION_ARGS);
 
 extern Datum pg_stat_get_function_calls(PG_FUNCTION_ARGS);
 extern Datum pg_stat_get_function_time(PG_FUNCTION_ARGS);
 
 extern Datum pg_stat_get_function_calls(PG_FUNCTION_ARGS);
 extern Datum pg_stat_get_function_time(PG_FUNCTION_ARGS);
@@ -346,6 +350,66 @@ pg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS)
                PG_RETURN_TIMESTAMPTZ(result);
 }
 
                PG_RETURN_TIMESTAMPTZ(result);
 }
 
+Datum
+pg_stat_get_vacuum_count(PG_FUNCTION_ARGS)
+{
+       Oid                     relid = PG_GETARG_OID(0);
+       int64           result;
+       PgStat_StatTabEntry     *tabentry;
+
+       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+               result = 0;
+       else
+               result = (int64) (tabentry->vacuum_count);
+
+       PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_autovacuum_count(PG_FUNCTION_ARGS)
+{
+       Oid                     relid = PG_GETARG_OID(0);
+       int64           result;
+       PgStat_StatTabEntry     *tabentry;
+
+       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+               result = 0;
+       else
+               result = (int64) (tabentry->autovac_vacuum_count);
+
+       PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_analyze_count(PG_FUNCTION_ARGS)
+{
+       Oid                     relid = PG_GETARG_OID(0);
+       int64           result;
+       PgStat_StatTabEntry     *tabentry;
+
+       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+               result = 0;
+       else
+               result = (int64) (tabentry->analyze_count);
+
+       PG_RETURN_INT64(result);
+}
+
+Datum
+pg_stat_get_autoanalyze_count(PG_FUNCTION_ARGS)
+{
+       Oid                     relid = PG_GETARG_OID(0);
+       int64           result;
+       PgStat_StatTabEntry     *tabentry;
+
+       if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+               result = 0;
+       else
+               result = (int64) (tabentry->autovac_analyze_count);
+
+       PG_RETURN_INT64(result);
+}
+
 Datum
 pg_stat_get_function_calls(PG_FUNCTION_ARGS)
 {
 Datum
 pg_stat_get_function_calls(PG_FUNCTION_ARGS)
 {
index db5f3c67b3a0b9d01973ed8b89d959a4c1d402fa..5c538e6f790633b3c16c69ca5c650728bea80acb 100644 (file)
@@ -37,7 +37,7 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.595 2010/08/13 18:36:24 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.596 2010/08/21 10:59:17 mha Exp $
  *
  *-------------------------------------------------------------------------
  */
  *
  *-------------------------------------------------------------------------
  */
@@ -53,6 +53,6 @@
  */
 
 /*                                                     yyyymmddN */
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     201008131
+#define CATALOG_VERSION_NO     201008211
 
 #endif
 
 #endif
index 7531b7ab5ec69f1305d186771f88305cf65a80df..c4dd14a71e7162a7bd1df55dfdf4791a3432995a 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.579 2010/08/13 18:36:25 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.580 2010/08/21 10:59:17 mha Exp $
  *
  * NOTES
  *       The script catalog/genbki.pl reads this file and generates .bki
  *
  * NOTES
  *       The script catalog/genbki.pl reads this file and generates .bki
@@ -3029,6 +3029,14 @@ DATA(insert OID = 2783 (  pg_stat_get_last_analyze_time PGNSP PGUID 12 1 0 0 f f
 DESCR("statistics: last manual analyze time for a table");
 DATA(insert OID = 2784 (  pg_stat_get_last_autoanalyze_time PGNSP PGUID 12 1 0 0 f f f t f s 1 0 1184 "26" _null_ _null_ _null_ _null_ pg_stat_get_last_autoanalyze_time _null_ _null_ _null_ ));
 DESCR("statistics: last auto analyze time for a table");
 DESCR("statistics: last manual analyze time for a table");
 DATA(insert OID = 2784 (  pg_stat_get_last_autoanalyze_time PGNSP PGUID 12 1 0 0 f f f t f s 1 0 1184 "26" _null_ _null_ _null_ _null_ pg_stat_get_last_autoanalyze_time _null_ _null_ _null_ ));
 DESCR("statistics: last auto analyze time for a table");
+DATA(insert OID = 3054 ( pg_stat_get_vacuum_count PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_vacuum_count _null_ _null_ _null_ ));
+DESCR("statistics: number of manual vacuums for a table");
+DATA(insert OID = 3055 ( pg_stat_get_autovacuum_count PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_autovacuum_count _null_ _null_ _null_ ));
+DESCR("statistics: number of auto vacuums for a table");
+DATA(insert OID = 3056 ( pg_stat_get_analyze_count PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_analyze_count _null_ _null_ _null_ ));
+DESCR("statistics: number of manual analyzes for a table");
+DATA(insert OID = 3057 ( pg_stat_get_autoanalyze_count PGNSP PGUID 12 1 0 0 f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_autoanalyze_count _null_ _null_ _null_ ));
+DESCR("statistics: number of auto analyzes for a table");
 DATA(insert OID = 1936 (  pg_stat_get_backend_idset            PGNSP PGUID 12 1 100 0 f f f t t s 0 0 23 "" _null_ _null_ _null_ _null_ pg_stat_get_backend_idset _null_ _null_ _null_ ));
 DESCR("statistics: currently active backend IDs");
 DATA(insert OID = 2022 (  pg_stat_get_activity                 PGNSP PGUID 12 1 100 0 f f f f t s 1 0 2249 "23" "{23,26,23,26,25,25,16,1184,1184,1184,869,23}" "{i,o,o,o,o,o,o,o,o,o,o,o}" "{pid,datid,procpid,usesysid,application_name,current_query,waiting,xact_start,query_start,backend_start,client_addr,client_port}" _null_ pg_stat_get_activity _null_ _null_ _null_ ));
 DATA(insert OID = 1936 (  pg_stat_get_backend_idset            PGNSP PGUID 12 1 100 0 f f f t t s 0 0 23 "" _null_ _null_ _null_ _null_ pg_stat_get_backend_idset _null_ _null_ _null_ ));
 DESCR("statistics: currently active backend IDs");
 DATA(insert OID = 2022 (  pg_stat_get_activity                 PGNSP PGUID 12 1 100 0 f f f f t s 1 0 2249 "23" "{23,26,23,26,25,25,16,1184,1184,1184,869,23}" "{i,o,o,o,o,o,o,o,o,o,o,o}" "{pid,datid,procpid,usesysid,application_name,current_query,waiting,xact_start,query_start,backend_start,client_addr,client_port}" _null_ pg_stat_get_activity _null_ _null_ _null_ ));
index fae6cb8155fcc1ddb39c061388261f13c4668248..1bbe008c463a54a2f98ef7a15697acd74952e7ae 100644 (file)
@@ -5,7 +5,7 @@
  *
  *     Copyright (c) 2001-2010, PostgreSQL Global Development Group
  *
  *
  *     Copyright (c) 2001-2010, PostgreSQL Global Development Group
  *
- *     $PostgreSQL: pgsql/src/include/pgstat.h,v 1.90 2010/08/08 16:27:06 tgl Exp $
+ *     $PostgreSQL: pgsql/src/include/pgstat.h,v 1.91 2010/08/21 10:59:17 mha Exp $
  * ----------
  */
 #ifndef PGSTAT_H
  * ----------
  */
 #ifndef PGSTAT_H
@@ -525,9 +525,13 @@ typedef struct PgStat_StatTabEntry
        PgStat_Counter blocks_hit;
 
        TimestampTz vacuum_timestamp;           /* user initiated vacuum */
        PgStat_Counter blocks_hit;
 
        TimestampTz vacuum_timestamp;           /* user initiated vacuum */
+       PgStat_Counter vacuum_count;
        TimestampTz autovac_vacuum_timestamp;           /* autovacuum initiated */
        TimestampTz autovac_vacuum_timestamp;           /* autovacuum initiated */
+       PgStat_Counter autovac_vacuum_count;
        TimestampTz analyze_timestamp;          /* user initiated */
        TimestampTz analyze_timestamp;          /* user initiated */
+       PgStat_Counter analyze_count;
        TimestampTz autovac_analyze_timestamp;          /* autovacuum initiated */
        TimestampTz autovac_analyze_timestamp;          /* autovacuum initiated */
+       PgStat_Counter autovac_analyze_count;
 } PgStat_StatTabEntry;
 
 
 } PgStat_StatTabEntry;