F.25. pg_buffercache — информация о состоянии буферного кеша PostgreSQL #
Модуль pg_buffercache
даёт возможность понять, что происходит в общем кеше буферов в реальном времени, а также позволяет вытеснять данные из него на низком уровне в целях тестирования.
Этот модуль предоставляет функцию pg_buffercache_pages()
(обёрнута в представление pg_buffercache
), а также функции pg_buffercache_summary()
, pg_buffercache_usage_counts()
и pg_buffercache_evict()
.
Функция pg_buffercache_pages()
возвращает набор записей, каждая строка которого описывает состояние одного буфера в общем кеше. Для удобства пользования обёрткой функции является представление pg_buffercache
.
Функция pg_buffercache_summary()
возвращает одну строку со сводной информацией о состоянии общего кеша буферов.
Функция pg_buffercache_usage_counts()
возвращает набор записей, в каждой строке которого указано количество буферов в разбивке по счётчику использования.
По умолчанию использование упомянутых выше функций разрешено только суперпользователям и ролям с правами роли pg_monitor
. Дать доступ другим ролям можно с помощью GRANT
.
Функция pg_buffercache_evict()
позволяет вытеснять блоки из пула буферов по идентификатору блока. Вызывать эту функцию разрешено только суперпользователям.
F.25.1. Представление pg_buffercache
#
Определения столбцов, содержащихся в представлении, показаны в Таблице F.14.
Таблица F.14. Столбцы pg_buffercache
Тип столбца Описание |
---|
ID, в диапазоне 1.. |
Номер файлового узла для отношения |
OID табличного пространства, содержащего отношение |
OID базы данных, содержащей отношение |
Номер слоя в отношении; см. |
Номер страницы в отношении |
Страница загрязнена? |
Счётчик обращений по часовой стрелке |
Число обслуживающих процессов, закрепивших этот буфер |
Для каждого буфера в общем кеше выдаётся одна строка. Для неиспользуемых буферов все поля равны NULL, за исключением bufferid
. Общие системные каталоги показываются как относящиеся к базе данных под номером 0.
Так как кеш используется совместно всеми базами данных, обычно в нём находятся и страницы из отношений, не принадлежащих текущей базе данных. Это означает, что для некоторых строк при соединении с pg_class
не найдутся соответствующие строки, либо соединение будет некорректным. Если вы хотите выполнить соединение с pg_class
, будет правильным ограничить соединение строками, в которых reldatabase
содержит OID текущей базы данных или ноль.
Для копирования данных состояния, которые будут отображаться, блокировки в менеджере буферов не устанавливаются. Поэтому обращения к представлению pg_buffercache
меньше сказываются на обычной активности буферов, но набор результатов, полученный для всех буферов, в целом может оказаться несогласованным. Однако внутри каждого отдельного буфера согласованность информации гарантируется.
F.25.2. Функция pg_buffercache_summary()
#
Определения столбцов, возвращаемых функцией, показаны в Таблице F.15.
Таблица F.15. Выходные столбцы pg_buffercache_summary()
Тип столбца Описание |
---|
Число используемых общих буферов |
Число неиспользуемых общих буферов |
Число загрязнённых общих буферов |
Число закреплённых общих буферов |
Среднее значение счётчика использования общих буферов |
Функция pg_buffercache_summary()
возвращает одну строку со сводной информацией о состоянии всех общих буферов. Подобную и более подробную информацию можно получить из представления pg_buffercache
, но pg_buffercache_summary()
обходится существенно дешевле.
Как и представление pg_buffercache
, pg_buffercache_summary()
не получает блокировки менеджера буферов, поэтому при параллельной работе в базе данных допустима незначительная погрешность результатов функции.
F.25.3. Функция pg_buffercache_usage_counts()
#
Определения столбцов, возвращаемых функцией, показаны в Таблице F.16.
Таблица F.16. Выходные столбцы pg_buffercache_usage_counts()
Тип столбца Описание |
---|
Возможное значение счётчика использования буферов |
Число буферов в разбивке по счётчику использования |
Число загрязнённых буферов в разбивке по счётчику использования |
Число закреплённых буферов в разбивке по счётчику использования |
Функция pg_buffercache_usage_counts()
возвращает набор строк со сводной информацией о состоянии всех общих буферов, агрегированных по возможным значениям счётчика использования. Подобную и более подробную информацию можно получить с помощью представления pg_buffercache
, но pg_buffercache_usage_counts()
обходится существенно дешевле.
Как и представление pg_buffercache
, pg_buffercache_usage_counts()
не получает блокировки менеджера буферов, поэтому при параллельной работе в базе данных допустима незначительная погрешность результатов функции.
F.25.4. Функция pg_buffercache_evict()
#
Функция pg_buffercache_evict()
принимает идентификатор буфера, который отображается в столбце bufferid
представления pg_buffercache
. Возвращает true в случае успеха и false, если буфер был недействителен, не мог быть вытеснен, так как был закреплён, или снова загрязнился после попытки записи. После завершения функции результат сразу становится устаревшим, поскольку из-за параллельно выполняемых операций буфер может снова стать действительным в любое время. Эта функция предназначена только для тестирования.
F.25.5. Пример вывода #
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) regression=# SELECT * FROM pg_buffercache_summary(); buffers_used | buffers_unused | buffers_dirty | buffers_pinned | usagecount_avg --------------+----------------+---------------+----------------+---------------- 248 | 2096904 | 39 | 0 | 3.141129 (1 row) regression=# SELECT * FROM pg_buffercache_usage_counts(); usage_count | buffers | dirty | pinned -------------+---------+-------+-------- 0 | 14650 | 0 | 0 1 | 1436 | 671 | 0 2 | 102 | 88 | 0 3 | 23 | 21 | 0 4 | 9 | 7 | 0 5 | 164 | 106 | 0 (6 rows)
F.25.6. Авторы #
Марк Кирквуд <markir@paradise.net.nz>
Предложения по конструкции: Нейл Конвей <neilc@samurai.com>
Советы по отладке: Том Лейн <tgl@sss.pgh.pa.us>
Chapter 33. Large Objects
Table of Contents
- 33.1. Introduction
- 33.2. Implementation Features
- 33.3. Client Interfaces
- 33.3.1. Creating a Large Object
- 33.3.2. Importing a Large Object
- 33.3.3. Exporting a Large Object
- 33.3.4. Opening an Existing Large Object
- 33.3.5. Writing Data to a Large Object
- 33.3.6. Reading Data from a Large Object
- 33.3.7. Seeking in a Large Object
- 33.3.8. Obtaining the Seek Position of a Large Object
- 33.3.9. Truncating a Large Object
- 33.3.10. Closing a Large Object Descriptor
- 33.3.11. Removing a Large Object
- 33.4. Server-side Functions
- 33.5. Example Program
Postgres Pro has a large object facility, which provides stream-style access to user data that is stored in a special large-object structure. Streaming access is useful when working with data values that are too large to manipulate conveniently as a whole.
This chapter describes the implementation and the programming and query language interfaces to Postgres Pro large object data. We use the libpq C library for the examples in this chapter, but most programming interfaces native to Postgres Pro support equivalent functionality. Other interfaces might use the large object interface internally to provide generic support for large values. This is not described here.