pg_buffercache

Автор: talifa, 8 июня, 2023

  • bufferid        integer         ID,             в диапазоне 1..shared_buffers
    relfilenode        oid        pg_class.relfilenode    Номер файлового узла для отношения
    reltablespace        oid        pg_tablespace.oid    OID табличного пространства, содержащего отношение
    reldatabase        oid        pg_database.oid        OID базы данных, содержащей отношение
    relforknumber        smallint    Номер слоя в отношении; см. include/common/relpath.h
    relblocknumber        bigint         Номер страницы в отношении
    isdirty            boolean         Страница загрязнена?
    usagecount        smallint    Cчётчик обращений по часовой стрелке
    pinning_backends    integer         Число обслуживающих процессов, закрепивших этот буфер

буфера, страницы
SELECT bufferid,  relfilenode,
 CASE relforknumber
   WHEN 0 THEN 'main'
   WHEN 1 THEN 'fsm'
   WHEN 2 THEN 'vm'
 END relfork,
 relblocknumber,  isdirty,  usagecount,  pinning_backends
FROM pg_buffercache
WHERE relfilenode = pg_relation_filenode('table'::regclass);

SELECT count(*),
 CASE relforknumber
   WHEN 0 THEN 'main'
   WHEN 1 THEN 'fsm'
   WHEN 2 THEN 'vm'
 END relfork
FROM pg_buffercache
WHERE relfilenode = pg_relation_filenode('t'::regclass) group by relfork;

 распределение буферов по степени их использования
SELECT usagecount, count(*)
FROM pg_buffercache
GROUP BY usagecount
ORDER BY usagecount;
 

какая доля каких таблиц в нашей базе закеширована и насколько активно используются эти данные   (под активным использованием в этом запросе понимаются буферы со счетчиком использования больше 3)

SELECT c.relname,
 count(*) blocks,
 round( 100.0 * 8192 * count(*) / pg_table_size(c.oid) ) "% of rel",
 round( 100.0 * 8192 * count(*) FILTER (WHERE b.usagecount > 3) / pg_table_size(c.oid) ) "% hot"
FROM pg_buffercache b
 JOIN pg_class c ON pg_relation_filenode(c.oid) = b.relfilenode
WHERE  b.reldatabase IN (
        0, (SELECT oid FROM pg_database WHERE datname = current_database())
      )
AND    b.usagecount is not null
GROUP BY c.relname, c.oid
ORDER BY 2 DESC
LIMIT 10;