F.36. pg_buffercache#

F.36. pg_buffercache

F.36. pg_buffercache

Модуль pg_buffercache предоставляет возможность изучать, что происходит в общем кеше буферов в реальном времени.

Модуль предоставляет функцию на языке C pg_buffercache_pages, которая возвращает набор записей, а также представление pg_buffercache, которое оборачивает функцию для удобного использования.

По умолчанию использование ограничено суперпользователям и ролям с привилегиями роли pg_monitor. Доступ может быть предоставлен другим пользователям с помощью команды GRANT.

F.36.1. Представление pg_buffercache

Все определения столбцов, предоставляемых представлением, показаны в Таблица F.15.

Таблица F.15. pg_buffercache Колонки

Тип столбца

Описание

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

Номер форка внутри отношения; см. common/relpath.h

relblocknumber bigint

Номер страницы в отношении

isdirty boolean

Страница грязная?

usagecount smallint

Число доступов при очистке часов

pinning_backends integer

Количество бэкендов, закрепляющих этот буфер


Вся информация о буферах в общем кеше представлена в виде одной строки для каждого буфера. Неиспользуемые буферы отображаются с пустыми значениями для всех полей, кроме bufferid. Общие системные каталоги отображаются как принадлежащие к базе данных с номером ноль.

Поскольку кеш используется всеми базами данных, обычно в нем будут страницы отношений, не принадлежащих текущей базе данных. Это означает, что для некоторых строк может не быть соответствующих строк соединения в pg_class, или даже могут быть неправильные соединения. Если вы пытаетесь объединить с pg_class, хорошей идеей будет ограничить соединение строками, у которых reldatabase равно OID текущей базы данных или нулю.

Так как блокировки менеджера буферов не применяются для копирования данных состояния буфера, которые будут отображаться в представлении pg_buffercache, доступ к этому представлению оказывает меньшее влияние на нормальную активность буфера, но не обеспечивает последовательный набор результатов для всех буферов. Однако мы гарантируем, что информация о каждом буфере является самосогласованной.

F.36.2. Пример вывода

regression=# SELECT n.nspname, c.relname, count(*) AS buffers
             FROM pg_buffercache b JOIN pg_class c
             ON b.relfilenode = pg_relation_filenode(c.oid) AND
                b.reldatabase IN (0, (SELECT oid FROM pg_database
                                      WHERE datname = current_database()))
             JOIN pg_namespace n ON n.oid = c.relnamespace
             GROUP BY n.nspname, c.relname
             ORDER BY 3 DESC
             LIMIT 10;

  nspname   |        relname         | buffers
------------+------------------------+---------
 public     | delete_test_table      |     593
 public     | delete_test_table_pkey |     494
 pg_catalog | pg_attribute           |     472
 public     | quad_poly_tbl          |     353
 public     | tenk2                  |     349
 public     | tenk1                  |     349
 public     | gin_test_idx           |     306
 pg_catalog | pg_largeobject         |     206
 public     | gin_test_tbl           |     188
 public     | spgist_text_tbl        |     182
(10 rows)

F.36.3. Авторы

Mark Kirkwood

Советы по проектированию: Нил Конвей (Neil Conway)

Советы по отладке: Tom Lane