]> 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>
@@ -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
-   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>
@@ -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,
-      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>
 
@@ -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).
-      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>
@@ -718,6 +722,38 @@ postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
       </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>
index 217e597513b00666047651509f14bb83cb26b9b6..a1604802892c62a3527fa9be7bafe9f6b92b2cb9 100644 (file)
@@ -3,7 +3,7 @@
  *
  * 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 
@@ -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_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) 
index ae8db9e9deaf4bb3461c304dae3d0fec0431bb27..b1782da42370c53c672ef533a5ebff855113b8e3 100644 (file)
@@ -13,7 +13,7 @@
  *
  *     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"
@@ -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->vacuum_count = 0;
+               result->autovac_vacuum_count = 0;
+               result->analyze_count = 0;
+               result->autovac_analyze_count = 0;
        }
 
        return result;
@@ -4114,9 +4118,15 @@ pgstat_recv_vacuum(PgStat_MsgVacuum *msg, int len)
        tabentry->n_dead_tuples = 0;
 
        if (msg->m_autovacuum)
+       {
                tabentry->autovac_vacuum_timestamp = msg->m_vacuumtime;
+               tabentry->autovac_vacuum_count++;
+       }
        else
+       {
                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->autovac_analyze_timestamp = msg->m_analyzetime;
+               tabentry->autovac_analyze_count++;
+       }
        else
+       {
                tabentry->analyze_timestamp = msg->m_analyzetime;
+               tabentry->analyze_count++;
+       }
 }
 
 
index 77627dbdf362e006a2ef5bffb6639afcec85c7af..9432fc86c6ad546e3c7992147b3837332f5207a7 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * 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_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);
@@ -346,6 +350,66 @@ pg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS)
                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)
 {
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
  *
- * $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 */
-#define CATALOG_VERSION_NO     201008131
+#define CATALOG_VERSION_NO     201008211
 
 #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
  *
- * $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
@@ -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");
+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_ ));
index fae6cb8155fcc1ddb39c061388261f13c4668248..1bbe008c463a54a2f98ef7a15697acd74952e7ae 100644 (file)
@@ -5,7 +5,7 @@
  *
  *     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
@@ -525,9 +525,13 @@ typedef struct PgStat_StatTabEntry
        PgStat_Counter blocks_hit;
 
        TimestampTz vacuum_timestamp;           /* user initiated vacuum */
+       PgStat_Counter vacuum_count;
        TimestampTz autovac_vacuum_timestamp;           /* autovacuum initiated */
+       PgStat_Counter autovac_vacuum_count;
        TimestampTz analyze_timestamp;          /* user initiated */
+       PgStat_Counter analyze_count;
        TimestampTz autovac_analyze_timestamp;          /* autovacuum initiated */
+       PgStat_Counter autovac_analyze_count;
 } PgStat_StatTabEntry;