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, выполните следующие действия:

  1. Добавьте имя библиотеки в переменную shared_preload_libraries в файле postgresql.conf:

    shared_preload_libraries = 'pgpro_result_cache'
  2. Перезагрузите сервер баз данных, чтобы изменения вступили в силу.

    Чтобы убедиться, что библиотека pgpro_result_cache установлена правильно, выполните следующую команду:

    SHOW shared_preload_libraries;
  3. Создайте расширение pgpro_result_cache с помощью следующего запроса:

    CREATE EXTENSION pgpro_result_cache;

    Расширение pgpro_result_cache использует кеш разделяемой памяти, который инициализируется только при запуске сервера, поэтому данная библиотека также должна предзагружаться при запуске. Расширение pgpro_result_cache следует создать в каждой базе данных, где требуется кеширование запросов.

  4. Включите расширение с помощью параметра 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

ИмяТипОписание
dbidoidИдентификатор базы данных, в которой выполнялся запрос
query_idbigintСтандартный идентификатор запроса
const_hashbigintХеш непараметризованных констант
params_hashbigintХеш параметров запроса
createdtimestampВременная метка первого кеширования
exec_time_msrealВремя выполнения запроса, в миллисекундах
hitsintКоличество выполнений
rows_countintЧисло строк в кешированном наборе результатов
data_sizebigintОбщий размер набора результатов в памяти кеша, в байтах
query_stringtextТекст запроса в формате, пригодном для кеширования, без комментариев или префиксов EXPLAIN (ANALYZE)

G.5.7.2. Представление pgpro_result_cache_stat #

Представление pgpro_result_cache_stat отображает счётчики кеша. Столбцы представления показаны в Таблице G.80.

Таблица G.80. Столбцы pgpro_result_cache_stat

ИмяТипОписание
free_kbbigintДоступная память кеша, в килобайтах, ограниченная pgpro_result_cache.max_memory_size
entriesbigintТекущее число записей в кеше, включая устаревшие (если они не были удалены), ограниченное pgpro_result_cache.max_entries
hitsbigintЧисло успешных извлечений из кеша
insertsbigintЧисло новых записей, включая замены устаревших
evictsbigintЗаписи, удалённые с помощью алгоритма вытеснения давно неиспользуемых данных (LRU) при достижении предела pgpro_result_cache.max_entries
cleanupsbigintЗаписи, удалённые с помощью алгоритма вытеснения давно неиспользуемых данных (LRU) при достижении предела pgpro_result_cache.max_memory_size
not_cachedbigintЗапросы, исключённые из кеширования (из-за высокой скорости выполнения, большого размера или иных причин)

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 / 2. Текст запроса хранится в памяти вместе с данными результатов, поэтому значение параметра должно быть достаточно большим для размещения обоих значений. При изменении параметра во время выполнения он применяется только к новым кешируемым результатам без автоматического вытеснения существующих.

pgpro_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. Изменить этот параметр могут только суперпользователи. Изменение этого параметра сбрасывает кеш. Этот параметр предназначен для целей отладки и не рекомендован для использования в рабочей среде.