G.5. pgpro_result_cache — сохранение результатов запросов для переиспользования #
G.5.1. Описание #
Расширение pgpro_result_cache кеширует результаты запросов в разделяемой памяти с помощью указаний, повышая производительность при повторном выполнении запросов. Кешированные результаты не сохраняются после перезапуска сервера.
G.5.2. Установка #
Расширение pgpro_result_cache поставляется вместе с Postgres Pro Enterprise в виде отдельного пакета pgpro-result-cache-ent-16
(подробные инструкции по установке приведены в Главе 17).
Чтобы включить pgpro_result_cache, выполните следующие действия:
Добавьте имя библиотеки в переменную
shared_preload_libraries
в файлеpostgresql.conf
:shared_preload_libraries = 'pgpro_result_cache'
Перезагрузите сервер баз данных, чтобы изменения вступили в силу.
Чтобы убедиться, что библиотека pgpro_result_cache установлена правильно, выполните следующую команду:
SHOW shared_preload_libraries;
Создайте расширение pgpro_result_cache с помощью следующего запроса:
CREATE EXTENSION pgpro_result_cache;
Расширение pgpro_result_cache использует кеш разделяемой памяти, который инициализируется только при запуске сервера, поэтому данная библиотека также должна предзагружаться при запуске. Расширение pgpro_result_cache следует создать в каждой базе данных, где требуется кеширование запросов.
Включите расширение с помощью параметра pgpro_result_cache.enable.
SET pgpro_result_cache.enable = ON;
G.5.3. Использование #
Для обработки запроса с помощью расширения pgpro_result_cache используйте указание result_cache
в комментарии особого вида, который начинается на /*+
и заканчивается на */
.
/*+result_cache*/ select now() from generate_series(1,5);
Если в разделяемой памяти есть действительный кешированный набор результатов для этого запроса, он немедленно возвращается без выполнения запроса, а число обращений увеличивается. В противном случае выполняется запрос, и набор результатов сохраняется в разделяемой памяти с текущей временной меткой. Представление pgpro_result_cache_data показывает все кешированные наборы результатов.
Параметр pgpro_result_cache.max_memory_size задаёт максимальный размер разделяемой памяти кеша. Параметр pgpro_result_cache.max_entries определяет максимальное количество кешированных наборов результатов. Если при добавлении нового значения достигнут какой-то из этих пределов, pgpro_result_cache удаляет наборы результатов из памяти кеша с помощью алгоритма вытеснения давно неиспользуемых данных (least recently used, LRU).
Можно также указать время жизни (Time To Live, TTL) для кешированных наборов результатов с помощью параметра pgpro_result_cache.ttl. Набор результатов считается действительным и хранится в памяти кеша пока не истечёт его TTL.
Если выключено автоматическое аннулирование (по умолчанию):
Расширение кеширует результаты изменяемых функций, что приводит к возврату идентичных результатов при последующих вызовах.
Расширение фиксирует набор результатов на момент транзакции и затем не следит за обновлениями кешированных данных, даже если транзакцию отменили или не зафиксировали. Последующие запросы будут возвращать первоначальный кешированный результат, даже если нижележащие данные были изменены более поздними транзакциями.
Примечание
Кешированные результаты игнорируют политику защиты на уровне строк. Убедитесь, что конфиденциальные запросы не кешируются.
G.5.4. Идентификация кешированного набора результатов #
Кешированный набор результатов идентифицируется комбинацией атрибутов database_id
, query_id
, const_hash
, params_hash
и query_string
. Атрибуты database_id
и query_id
назначаются сервером Postgres Pro Enterprise.
const_hash
содержит вычисленный хеш всех констант, содержащихся в запросе. Константы с одинаковым значением, но разными типами, например, 1
и '1'
, дадут разные значения хеша. 0
означает отсутствие констант.
params_hash
содержит вычисленный хеш всех значений параметров запроса. 0
означает отсутствие параметров.
G.5.5. Автоматическое аннулирование #
Расширение pgpro_result_cache поддерживает автоматическое аннулирование для обеспечения согласованности кешированных результатов с помощью отслеживания изменений базы данных и применения определённых ограничений. По умолчанию автоматическое аннулирование выключено. Чтобы включить его, установите для параметра pgpro_result_cache.consistent значение on
. Изменение этого параметра сбрасывает кеш.
Когда включено автоматическое аннулирование, расширение работает следующим образом:
Кеширует только запросы, которые не вносят изменения в базу данных. Не обслуживает транзакции (ни читающие, ни пишущие), которые имеют незафиксированные изменения.
При каждой DML-операции, например,
INSERT
,UPDATE
,DELETE
илиTRUNCATE
, аннулирует кешированные результаты, связанные с изменёнными отношениями.При каждой DDL-операции, например,
ALTER TABLE
илиDROP TABLE
, аннулирует кешированные результаты, связанные с изменёнными отношениями.Не кеширует запросы, использующие временные таблицы.
Не кеширует запросы, использующие нежурналируемые таблицы.
Не кеширует запросы, использующие пользовательские функции или типы.
Не кеширует запросы, использующие изменяемые функции.
Примечание
Автоматическое аннулирование не работает для секций таблиц, если их данные были неявно изменены.
G.5.6. Совместимость с pg_hint_plan #
Указание result_cache
можно использовать вместе с указаниями, поддерживаемыми расширением pg_hint_plan. Каждое расширение читает только его поддерживаемые указания и игнорирует остальные.
/*+result_cache SeqScan(t1)*/ SELECT * FROM table1 t1 JOIN table table2 t2 ON (t1.key = t2.key);
G.5.7. Представления #
G.5.7.1. Представление pgpro_result_cache_data
#
Представление pgpro_result_cache_data
отображает все кешированные наборы результатов. Столбцы представления показаны в Таблице G.79.
Таблица G.79. Столбцы pgpro_result_cache_data
Имя | Тип | Описание |
---|---|---|
dbid | oid | Идентификатор базы данных, в которой выполнялся запрос |
query_id | bigint | Стандартный идентификатор запроса |
const_hash | bigint | Хеш непараметризованных констант |
params_hash | bigint | Хеш параметров запроса |
created | timestamp | Временная метка первого кеширования |
exec_time_ms | real | Время выполнения запроса, в миллисекундах |
hits | int | Количество выполнений |
rows_count | int | Число строк в кешированном наборе результатов |
data_size | bigint | Общий размер набора результатов в памяти кеша, в байтах |
query_string | text | Текст запроса в формате, пригодном для кеширования, без комментариев или префиксов EXPLAIN (ANALYZE) |
G.5.7.2. Представление pgpro_result_cache_stat
#
Представление pgpro_result_cache_stat
отображает счётчики кеша. Столбцы представления показаны в Таблице G.80.
Таблица G.80. Столбцы pgpro_result_cache_stat
Имя | Тип | Описание |
---|---|---|
free_kb | bigint | Доступная память кеша, в килобайтах, ограниченная pgpro_result_cache.max_memory_size |
entries | bigint | Текущее число записей в кеше, включая устаревшие (если они не были удалены), ограниченное pgpro_result_cache.max_entries |
hits | bigint | Число успешных извлечений из кеша |
inserts | bigint | Число новых записей, включая замены устаревших |
evicts | bigint | Записи, удалённые с помощью алгоритма вытеснения давно неиспользуемых данных (LRU) при достижении предела pgpro_result_cache.max_entries |
cleanups | bigint | Записи, удалённые с помощью алгоритма вытеснения давно неиспользуемых данных (LRU) при достижении предела pgpro_result_cache.max_memory_size |
not_cached | bigint | Запросы, исключённые из кеширования (из-за высокой скорости выполнения, большого размера или иных причин) |
G.5.8. Функции #
Вызывать нижеуказанные функции может только суперпользователь.
-
pgpro_result_cache_reset() returns bool
# Очищает кеш и сбрасывает все счётчики кешированных результатов. Возвращает
true
, если кешированные наборы результатов были удалены, иfalse
, если кеш был пуст.
G.5.9. Параметры конфигурации #
pgpro_result_cache.enable
(boolean
) #Активирует функциональность расширения pgpro_result_cache. Значение по умолчанию —
off
. Изменить этот параметр могут только суперпользователи.pgpro_result_cache.max_memory_size
(integer
) #Указывает размер разделяемой памяти, используемой для кеширования наборов результатов, в килобайтах. Значение по умолчанию —
64kB
. Этот параметр можно задать только при запуске сервера.pgpro_result_cache.max_entries
(integer
) #Устанавливает максимальное число кешированных наборов результатов. Значение по умолчанию —
128
. Этот параметр можно задать только при запуске сервера.pgpro_result_cache.max_entry_size
(integer
) #Задаёт максимальный объём потребления памяти для одного набора результатов, в килобайтах. Значение по умолчанию —
16kB
. Изменять этот параметр могут только суперпользователи. Не может превышать
. Текст запроса хранится в памяти вместе с данными результатов, поэтому значение параметра должно быть достаточно большим для размещения обоих значений. При изменении параметра во время выполнения он применяется только к новым кешируемым результатам без автоматического вытеснения существующих.pgpro_result_cache.max_memory_size
/ 2pgpro_result_cache.ttl
(integer
) #Задаёт время жизни кешированного результата, в секундах. Значение по умолчанию —
-1
, что означает отсутствие ограничения времени жизни. Изменить этот параметр могут только суперпользователи.pgpro_result_cache.min_exec_time
(integer
) #Задаёт минимальное время выполнения запроса, в миллисекундах. Значение по умолчанию —
-1
, что означает отсутствие ограничения времени. Положительное целое число означает, что запросы, выполняющиеся быстрее указанного времени, не будут сохраняться в кеше. Изменять этот параметр могут только суперпользователи.pgpro_result_cache.consistent
(boolean
) #Включает автоматическое аннулирование кешированных результатов. Значение по умолчанию —
off
. Изменить этот параметр могут только суперпользователи.pgpro_result_cache.enforced
(boolean
) #Позволяет pgpro_result_cache автоматически кешировать наборы результатов для всех запросов независимо от указания
result_cache
. Значение по умолчанию —off
. Изменить этот параметр могут только суперпользователи. Изменение этого параметра сбрасывает кеш. Этот параметр предназначен для целей отладки и не рекомендован для использования в рабочей среде.pgpro_result_cache.invisible
(boolean
) #Скрывает информацию о pgpro_result_cache из вывода
EXPLAIN
. Значение по умолчанию —off
. Изменить этот параметр могут только суперпользователи. Изменение этого параметра сбрасывает кеш. Этот параметр предназначен для целей отладки и не рекомендован для использования в рабочей среде.