On 09/16/2013 08:26 AM, Satoshi Nagayasu wrote:
> (2013/08/08 20:52), Vik Fearing wrote:
>> As part of routine maintenance monitoring, it is interesting for us to
>> have statistics on the CLUSTER command (timestamp of last run, and
>> number of runs since stat reset) like we have for (auto)ANALYZE and
>> (auto)VACUUM. Patch against today's HEAD attached.
>>
>> I would add this to the next commitfest but I seem to be unable to log
>> in with my community account (I can log in to the wiki). Help
>> appreciated.
>
> I have reviewed the patch.
Thank you for your review.
> Succeeded to build with the latest HEAD, and passed the regression
> tests.
>
> Looks good enough, and I'd like to add a test case here, not only
> for the view definition, but also working correctly.
>
> Please take a look at attached one.
Looks good to me. Attached is a rebased patch with those tests added.
--
Vik
*** a/doc/src/sgml/monitoring.sgml
--- b/doc/src/sgml/monitoring.sgml
***************
*** 979,984 **** postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
--- 979,989 ----
daemon</entry>
</row>
<row>
+ <entry><structfield>last_cluster</></entry>
+ <entry><type>timestamp with time zone</></entry>
+ <entry>Last time at which <command>CLUSTER</> was issued on this table</entry>
+ </row>
+ <row>
<entry><structfield>vacuum_count</></entry>
<entry><type>bigint</></entry>
<entry>Number of times this table has been manually vacuumed
***************
*** 1001,1006 **** postgres: <replaceable>user</> <replaceable>database</> <replaceable>host</> <re
--- 1006,1016 ----
<entry>Number of times this table has been analyzed by the autovacuum
daemon</entry>
</row>
+ <row>
+ <entry><structfield>cluster_count</></entry>
+ <entry><type>bigint</></entry>
+ <entry>Number of times <command>CLUSTER</> has been issued on this table</entry>
+ </row>
</tbody>
</tgroup>
</table>
*** a/src/backend/catalog/system_views.sql
--- b/src/backend/catalog/system_views.sql
***************
*** 410,419 **** CREATE VIEW pg_stat_all_tables AS
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_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)
--- 410,421 ----
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_cluster_time(C.oid) as last_cluster,
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,
! pg_stat_get_cluster_count(C.oid) AS cluster_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)
*** a/src/backend/commands/cluster.c
--- b/src/backend/commands/cluster.c
***************
*** 35,40 ****
--- 35,41 ----
#include "commands/vacuum.h"
#include "miscadmin.h"
#include "optimizer/planner.h"
+ #include "pgstat.h"
#include "storage/bufmgr.h"
#include "storage/lmgr.h"
#include "storage/predicate.h"
***************
*** 407,412 **** cluster_rel(Oid tableOid, Oid indexOid, bool recheck, bool verbose,
--- 408,417 ----
verbose);
/* NB: rebuild_relation does heap_close() on OldHeap */
+
+ /* Report CLUSTER to the stats collector, but not VACUUM FULL */
+ if (indexOid != InvalidOid)
+ pgstat_report_cluster(OldHeap);
}
/*
*** a/src/backend/postmaster/pgstat.c
--- b/src/backend/postmaster/pgstat.c
***************
*** 292,297 **** static void pgstat_recv_resetsinglecounter(PgStat_MsgResetsinglecounter *msg, in
--- 292,298 ----
static void pgstat_recv_autovac(PgStat_MsgAutovacStart *msg, int len);
static void pgstat_recv_vacuum(PgStat_MsgVacuum *msg, int len);
static void pgstat_recv_analyze(PgStat_MsgAnalyze *msg, int len);
+ static void pgstat_recv_cluster(PgStat_MsgCluster *msg, int len);
static void pgstat_recv_bgwriter(PgStat_MsgBgWriter *msg, int len);
static void pgstat_recv_funcstat(PgStat_MsgFuncstat *msg, int len);
static void pgstat_recv_funcpurge(PgStat_MsgFuncpurge *msg, int len);
***************
*** 1385,1390 **** pgstat_report_analyze(Relation rel,
--- 1386,1412 ----
}
/* --------
+ * pgstat_report_cluster() -
+ *
+ * Tell the collector about the table we just CLUSTERed.
+ * --------
+ */
+ void
+ pgstat_report_cluster(Relation rel)
+ {
+ PgStat_MsgCluster msg;
+
+ if (pgStatSock == PGINVALID_SOCKET)
+ return;
+
+ pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_CLUSTER);
+ msg.m_databaseid = rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId;
+ msg.m_tableoid = RelationGetRelid(rel);
+ msg.m_clustertime = GetCurrentTimestamp();
+ pgstat_send(&msg, sizeof(msg));
+ }
+
+ /* --------
* pgstat_report_recovery_conflict() -
*
* Tell the collector about a Hot Standby recovery conflict.
***************
*** 3266,3271 **** PgstatCollectorMain(int argc, char *argv[])
--- 3288,3297 ----
pgstat_recv_analyze((PgStat_MsgAnalyze *) &msg, len);
break;
+ case PGSTAT_MTYPE_CLUSTER:
+ pgstat_recv_cluster((PgStat_MsgCluster *) &msg, len);
+ break;
+
case PGSTAT_MTYPE_BGWRITER:
pgstat_recv_bgwriter((PgStat_MsgBgWriter *) &msg, len);
break;
***************
*** 3486,3491 **** pgstat_get_tab_entry(PgStat_StatDBEntry *dbentry, Oid tableoid, bool create)
--- 3512,3519 ----
result->analyze_count = 0;
result->autovac_analyze_timestamp = 0;
result->autovac_analyze_count = 0;
+ result->cluster_timestamp = 0;
+ result->cluster_count = 0;
}
return result;
***************
*** 4558,4563 **** pgstat_recv_tabstat(PgStat_MsgTabstat *msg, int len)
--- 4586,4593 ----
tabentry->analyze_count = 0;
tabentry->autovac_analyze_timestamp = 0;
tabentry->autovac_analyze_count = 0;
+ tabentry->cluster_timestamp = 0;
+ tabentry->cluster_count = 0;
}
else
{
***************
*** 4857,4862 **** pgstat_recv_analyze(PgStat_MsgAnalyze *msg, int len)
--- 4887,4916 ----
/* ----------
+ * pgstat_recv_cluster() -
+ *
+ * Process a CLUSTER message.
+ * ----------
+ */
+ static void
+ pgstat_recv_cluster(PgStat_MsgCluster *msg, int len)
+ {
+ PgStat_StatDBEntry *dbentry;
+ PgStat_StatTabEntry *tabentry;
+
+ /*
+ * Store the data in the table's hashtable entry.
+ */
+ dbentry = pgstat_get_db_entry(msg->m_databaseid, true);
+
+ tabentry = pgstat_get_tab_entry(dbentry, msg->m_tableoid, true);
+
+ tabentry->cluster_timestamp = msg->m_clustertime;
+ tabentry->cluster_count++;
+ }
+
+
+ /* ----------
* pgstat_recv_bgwriter() -
*
* Process a BGWRITER message.
*** a/src/backend/utils/adt/pgstatfuncs.c
--- b/src/backend/utils/adt/pgstatfuncs.c
***************
*** 41,50 **** extern Datum pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS);
--- 41,52 ----
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_cluster_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_cluster_count(PG_FUNCTION_ARGS);
extern Datum pg_stat_get_function_calls(PG_FUNCTION_ARGS);
extern Datum pg_stat_get_function_total_time(PG_FUNCTION_ARGS);
***************
*** 386,391 **** pg_stat_get_last_autoanalyze_time(PG_FUNCTION_ARGS)
--- 388,411 ----
}
Datum
+ pg_stat_get_last_cluster_time(PG_FUNCTION_ARGS)
+ {
+ Oid relid = PG_GETARG_OID(0);
+ TimestampTz result;
+ PgStat_StatTabEntry *tabentry;
+
+ if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+ result = 0;
+ else
+ result = tabentry->cluster_timestamp;
+
+ if (result == 0)
+ PG_RETURN_NULL();
+ else
+ PG_RETURN_TIMESTAMPTZ(result);
+ }
+
+ Datum
pg_stat_get_vacuum_count(PG_FUNCTION_ARGS)
{
Oid relid = PG_GETARG_OID(0);
***************
*** 446,451 **** pg_stat_get_autoanalyze_count(PG_FUNCTION_ARGS)
--- 466,486 ----
}
Datum
+ pg_stat_get_cluster_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->cluster_count);
+
+ PG_RETURN_INT64(result);
+ }
+
+ Datum
pg_stat_get_function_calls(PG_FUNCTION_ARGS)
{
Oid funcid = PG_GETARG_OID(0);
*** a/src/include/catalog/pg_proc.h
--- b/src/include/catalog/pg_proc.h
***************
*** 2607,2612 **** DATA(insert OID = 2783 ( pg_stat_get_last_analyze_time PGNSP PGUID 12 1 0 0 0 f
--- 2607,2614 ----
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 0 f 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 = 3178 ( pg_stat_get_last_cluster_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1184 "26" _null_ _null_ _null_ _null_ pg_stat_get_last_cluster_time _null_ _null_ _null_ ));
+ DESCR("statistics: last CLUSTER time for a table");
DATA(insert OID = 3054 ( pg_stat_get_vacuum_count PGNSP PGUID 12 1 0 0 0 f 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 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_autovacuum_count _null_ _null_ _null_ ));
***************
*** 2615,2620 **** DATA(insert OID = 3056 ( pg_stat_get_analyze_count PGNSP PGUID 12 1 0 0 0 f f f
--- 2617,2624 ----
DESCR("statistics: number of manual analyzes for a table");
DATA(insert OID = 3057 ( pg_stat_get_autoanalyze_count PGNSP PGUID 12 1 0 0 0 f 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 = 3179 ( pg_stat_get_cluster_count PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ pg_stat_get_cluster_count _null_ _null_ _null_ ));
+ DESCR("statistics: number of CLUSTERs for a table");
DATA(insert OID = 1936 ( pg_stat_get_backend_idset PGNSP PGUID 12 1 100 0 0 f 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 0 f f f f f t s 1 0 2249 "23" "{23,26,23,26,25,25,25,16,1184,1184,1184,1184,869,25,23}" "{i,o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{pid,datid,pid,usesysid,application_name,state,query,waiting,xact_start,query_start,backend_start,state_change,client_addr,client_hostname,client_port}" _null_ pg_stat_get_activity _null_ _null_ _null_ ));
*** a/src/include/pgstat.h
--- b/src/include/pgstat.h
***************
*** 44,49 **** typedef enum StatMsgType
--- 44,50 ----
PGSTAT_MTYPE_AUTOVAC_START,
PGSTAT_MTYPE_VACUUM,
PGSTAT_MTYPE_ANALYZE,
+ PGSTAT_MTYPE_CLUSTER,
PGSTAT_MTYPE_BGWRITER,
PGSTAT_MTYPE_FUNCSTAT,
PGSTAT_MTYPE_FUNCPURGE,
***************
*** 336,341 **** typedef struct PgStat_MsgVacuum
--- 337,355 ----
/* ----------
+ * PgStat_MsgCluster Sent by the backend after CLUSTER
+ * ----------
+ */
+ typedef struct PgStat_MsgCluster
+ {
+ PgStat_MsgHdr m_hdr;
+ Oid m_databaseid;
+ Oid m_tableoid;
+ TimestampTz m_clustertime;
+ } PgStat_MsgCluster;
+
+
+ /* ----------
* PgStat_MsgAnalyze Sent by the backend or autovacuum daemon
* after ANALYZE
* ----------
***************
*** 590,595 **** typedef struct PgStat_StatTabEntry
--- 604,611 ----
PgStat_Counter analyze_count;
TimestampTz autovac_analyze_timestamp; /* autovacuum initiated */
PgStat_Counter autovac_analyze_count;
+ TimestampTz cluster_timestamp;
+ PgStat_Counter cluster_count;
} PgStat_StatTabEntry;
***************
*** 776,781 **** extern void pgstat_report_vacuum(Oid tableoid, bool shared,
--- 792,798 ----
PgStat_Counter tuples);
extern void pgstat_report_analyze(Relation rel,
PgStat_Counter livetuples, PgStat_Counter deadtuples);
+ extern void pgstat_report_cluster(Relation rel);
extern void pgstat_report_recovery_conflict(int reason);
extern void pgstat_report_deadlock(void);
*** a/src/test/regress/expected/rules.out
--- b/src/test/regress/expected/rules.out
***************
*** 1631,1640 **** SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schem
| 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_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))) +
--- 1631,1642 ----
| 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_cluster_time(c.oid) AS last_cluster, +
| 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, +
! | pg_stat_get_cluster_count(c.oid) AS cluster_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))) +
***************
*** 1726,1735 **** SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schem
| pg_stat_all_tables.last_autovacuum, +
| pg_stat_all_tables.last_analyze, +
| pg_stat_all_tables.last_autoanalyze, +
| pg_stat_all_tables.vacuum_count, +
| pg_stat_all_tables.autovacuum_count, +
| pg_stat_all_tables.analyze_count, +
! | pg_stat_all_tables.autoanalyze_count +
| FROM pg_stat_all_tables +
| WHERE ((pg_stat_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_all_tables.schemaname ~ '^pg_toast'::text));
pg_stat_user_functions | SELECT p.oid AS funcid, +
--- 1728,1739 ----
| pg_stat_all_tables.last_autovacuum, +
| pg_stat_all_tables.last_analyze, +
| pg_stat_all_tables.last_autoanalyze, +
+ | pg_stat_all_tables.last_cluster, +
| pg_stat_all_tables.vacuum_count, +
| pg_stat_all_tables.autovacuum_count, +
| pg_stat_all_tables.analyze_count, +
! | pg_stat_all_tables.autoanalyze_count, +
! | pg_stat_all_tables.cluster_count +
| FROM pg_stat_all_tables +
| WHERE ((pg_stat_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_all_tables.schemaname ~ '^pg_toast'::text));
pg_stat_user_functions | SELECT p.oid AS funcid, +
***************
*** 1769,1778 **** SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schem
| pg_stat_all_tables.last_autovacuum, +
| pg_stat_all_tables.last_analyze, +
| pg_stat_all_tables.last_autoanalyze, +
| pg_stat_all_tables.vacuum_count, +
| pg_stat_all_tables.autovacuum_count, +
| pg_stat_all_tables.analyze_count, +
! | pg_stat_all_tables.autoanalyze_count +
| FROM pg_stat_all_tables +
| WHERE ((pg_stat_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_all_tables.schemaname !~ '^pg_toast'::text));
pg_stat_xact_all_tables | SELECT c.oid AS relid, +
--- 1773,1784 ----
| pg_stat_all_tables.last_autovacuum, +
| pg_stat_all_tables.last_analyze, +
| pg_stat_all_tables.last_autoanalyze, +
+ | pg_stat_all_tables.last_cluster, +
| pg_stat_all_tables.vacuum_count, +
| pg_stat_all_tables.autovacuum_count, +
| pg_stat_all_tables.analyze_count, +
! | pg_stat_all_tables.autoanalyze_count, +
! | pg_stat_all_tables.cluster_count +
| FROM pg_stat_all_tables +
| WHERE ((pg_stat_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_all_tables.schemaname !~ '^pg_toast'::text));
pg_stat_xact_all_tables | SELECT c.oid AS relid, +
*** a/src/test/regress/expected/stats.out
--- b/src/test/regress/expected/stats.out
***************
*** 28,34 **** SELECT pg_sleep(2.0);
CREATE TEMP TABLE prevstats AS
SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch,
(b.heap_blks_read + b.heap_blks_hit) AS heap_blks,
! (b.idx_blks_read + b.idx_blks_hit) AS idx_blks
FROM pg_catalog.pg_stat_user_tables AS t,
pg_catalog.pg_statio_user_tables AS b
WHERE t.relname='tenk2' AND b.relname='tenk2';
--- 28,40 ----
CREATE TEMP TABLE prevstats AS
SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch,
(b.heap_blks_read + b.heap_blks_hit) AS heap_blks,
! (b.idx_blks_read + b.idx_blks_hit) AS idx_blks,
! coalesce(t.last_vacuum, now()) AS last_vacuum,
! coalesce(t.last_analyze, now()) AS last_analyze,
! coalesce(t.last_cluster, now()) AS last_cluster,
! t.vacuum_count,
! t.analyze_count,
! t.cluster_count
FROM pg_catalog.pg_stat_user_tables AS t,
pg_catalog.pg_statio_user_tables AS b
WHERE t.relname='tenk2' AND b.relname='tenk2';
***************
*** 111,114 **** SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + cl.relpages,
--- 117,143 ----
t | t
(1 row)
+ -- table maintenance stats
+ ANALYZE tenk2;
+ VACUUM tenk2;
+ CLUSTER tenk2 USING tenk2_unique1;
+ SELECT pg_sleep(1.0);
+ pg_sleep
+ ----------
+
+ (1 row)
+
+ SELECT st.last_vacuum > pr.last_vacuum,
+ st.last_analyze > pr.last_analyze,
+ st.last_cluster > pr.last_cluster,
+ st.vacuum_count > pr.vacuum_count,
+ st.analyze_count > pr.analyze_count,
+ st.cluster_count > pr.cluster_count
+ FROM pg_stat_user_tables AS st, prevstats pr
+ WHERE st.relname='tenk2';
+ ?column? | ?column? | ?column? | ?column? | ?column? | ?column?
+ ----------+----------+----------+----------+----------+----------
+ t | t | t | t | t | t
+ (1 row)
+
-- End of Stats Test
*** a/src/test/regress/sql/stats.sql
--- b/src/test/regress/sql/stats.sql
***************
*** 22,28 **** SELECT pg_sleep(2.0);
CREATE TEMP TABLE prevstats AS
SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch,
(b.heap_blks_read + b.heap_blks_hit) AS heap_blks,
! (b.idx_blks_read + b.idx_blks_hit) AS idx_blks
FROM pg_catalog.pg_stat_user_tables AS t,
pg_catalog.pg_statio_user_tables AS b
WHERE t.relname='tenk2' AND b.relname='tenk2';
--- 22,34 ----
CREATE TEMP TABLE prevstats AS
SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch,
(b.heap_blks_read + b.heap_blks_hit) AS heap_blks,
! (b.idx_blks_read + b.idx_blks_hit) AS idx_blks,
! coalesce(t.last_vacuum, now()) AS last_vacuum,
! coalesce(t.last_analyze, now()) AS last_analyze,
! coalesce(t.last_cluster, now()) AS last_cluster,
! t.vacuum_count,
! t.analyze_count,
! t.cluster_count
FROM pg_catalog.pg_stat_user_tables AS t,
pg_catalog.pg_statio_user_tables AS b
WHERE t.relname='tenk2' AND b.relname='tenk2';
***************
*** 81,84 **** SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + cl.relpages,
--- 87,106 ----
FROM pg_statio_user_tables AS st, pg_class AS cl, prevstats AS pr
WHERE st.relname='tenk2' AND cl.relname='tenk2';
+ -- table maintenance stats
+ ANALYZE tenk2;
+ VACUUM tenk2;
+ CLUSTER tenk2 USING tenk2_unique1;
+
+ SELECT pg_sleep(1.0);
+
+ SELECT st.last_vacuum > pr.last_vacuum,
+ st.last_analyze > pr.last_analyze,
+ st.last_cluster > pr.last_cluster,
+ st.vacuum_count > pr.vacuum_count,
+ st.analyze_count > pr.analyze_count,
+ st.cluster_count > pr.cluster_count
+ FROM pg_stat_user_tables AS st, prevstats pr
+ WHERE st.relname='tenk2';
+
-- End of Stats Test
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers