I wanted to know the contents of the buffer cache in 7.4, so I created
this function and view that seems to work ok:

/* Takes relfilenode (from pg_class) and returns the number of
 * buffer cache pages it is using.
 */
PG_FUNCTION_INFO_V1(block_count);
Datum
block_count(PG_FUNCTION_ARGS)
{
        Oid relfilenode = PG_GETARG_OID(0);

        BufferDesc *buf;
        Buffer buffer;
        int count = 0;

        // 0 is not a valid relfilenode although pg_xactlock
        // uses it
        if (relfilenode == 0) {
                PG_RETURN_INT32(0);
        }

        for (buffer=1; BufferIsValid(buffer); ++buffer) {
                buf = &(BufferDescriptors[buffer - 1]);
                if (buf->tag.rnode.relNode == relfilenode) {
                        count ++;
                }
        }

        PG_RETURN_INT32(count);
}


/* Returns the number of buffer cache pages the specified relfilenode
 * is using. Using "buffer" view is probably easier.
 */
CREATE OR REPLACE FUNCTION block_count (oid)
RETURNS integer
LANGUAGE 'C' STABLE STRICT AS '/foo';

/* View to look at how much of the buffer cache different tables are
 * currently using.
 * Example:
 *   foo=# select * from buffer limit 10;
 *       relname    | block_count
 *   ---------------+-------------
 *    foo           |       13782
 *    bar           |        2575
 *   ...
 *   (10 rows)
 */
CREATE OR REPLACE VIEW buffer AS
SELECT * FROM (SELECT relname, block_count(relfilenode) FROM pg_class) t
WHERE block_count > 0 ORDER BY block_count DESC;





---------------------------(end of broadcast)---------------------------
TIP 9: the planner will ignore your desire to choose an index scan if your
      joining column's datatypes do not match

Reply via email to