Michael Fuhr wrote:
> Is vacuuming any table supposed to zero the statistics for all
> shared tables? Doesn't that have implications for autovacuum? The
> example below is in 8.2.4 but I'm seeing similar behavior in 8.1.9
> and 8.3devel.
The problem is that the database hash is cleared of databases that no
longer exist, and the database list is constructed by scanning
pg_database. Since no entry exist for the database we use for shared
tables (InvalidOid), the hash table is dropped. The attached patch
fixes this.
> Additionally, in 8.3devel doing anything that queries or modifies a
> shared table seems to zero the statistics for all shared tables.
I'm not sure if this is fixed by the patch; can you verify, or provide a
more specific description of the problem?
--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Index: src/backend/postmaster/pgstat.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/postmaster/pgstat.c,v
retrieving revision 1.158
diff -c -p -r1.158 pgstat.c
*** src/backend/postmaster/pgstat.c 27 May 2007 17:28:35 -0000 1.158
--- src/backend/postmaster/pgstat.c 7 Jun 2007 15:25:30 -0000
*************** pgstat_vacuum_tabstat(void)
*** 897,902 ****
--- 897,906 ----
* Collect the OIDs of either all databases or all tables, according to
* the parameter, into a temporary hash table. Caller should hash_destroy
* the result when done with it.
+ *
+ * NB -- this function adds an entry with InvalidOid if asked for a list of
+ * databases. This is because we use a shared table for such a database to
+ * keep stats for shared tables.
* ----------
*/
static HTAB *
*************** pgstat_collect_oids(Oid catalogid)
*** 930,935 ****
--- 934,950 ----
heap_endscan(scan);
heap_close(rel, AccessShareLock);
+ /*
+ * If we were asked for databases, add an entry for the pseudo-database
+ * with InvalidOid, where we store shared tables.
+ */
+ if (catalogid == DatabaseRelationId)
+ {
+ Oid invalid = InvalidOid;
+
+ hash_search(htab, (void *) &invalid, HASH_ENTER, NULL);
+ }
+
return htab;
}
---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly