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 (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers