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'

    Обратите внимание, что имена библиотек в переменной shared_preload_libraries должны добавляться в определённом порядке. Совместимость pgpro_result_cache с другими расширениями описана в Подразделе G.5.4.

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

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

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

    CREATE EXTENSION pgpro_result_cache;

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

G.5.3. Указания #

G.5.3.1. Указание result_cache #

Если в памяти существует актуальный (с неистёкшим TTL/временем жизни) кешированный набор результатов, он возвращается немедленно без выполнения запроса, а число обращений увеличивается. В противном случае выполняется запрос, и набор результатов сохраняется в разделяемой памяти с текущей временной меткой.

/*+result_cache*/ select now() from generate_series(1,5);

G.5.4. Совместимость с другими расширениями #

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

/*+ token_no_args token_no_args() token_with_args(optional, arguments()) */

Пробелы необязательны, кроме как после token_no_args без скобок. Все скобки должны быть парными и закрытыми.

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

Примечание

Расширения pgpro_result_cache и pg_hint_plan игнорируют указания друг друга.

G.5.5. Идентификация кешированного набора результатов #

Кешированный набор результатов идентифицируется комбинацией атрибутов 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.6. Представления #

G.5.6.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.6.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 (integer, kB)
entriesbigintТекущее число записей в кеше, включая устаревшие (если они не были удалены), ограниченное pgpro_result_cache.max_entries (integer)
hitsbigintЧисло успешных извлечений из кеша
insertsbigintЧисло новых записей, включая замены устаревших
evictsbigintЗаписи, вытесненные по алгоритму LRU (давно неиспользуемые) при достижении лимита max_entries
cleanupsbigintДополнительные записи, удалённые для соблюдения ограничения max_memory_size
not_cachedbigintЗапросы, исключённые из кеширования (из-за высокой скорости выполнения, большого размера или иных причин)

G.5.7. Функции #

Вызывать нижеуказанные функции может только суперпользователь.

pgpro_result_cache_reset() returns bool #

Очищает кеш и сбрасывает все счётчики кешированных реультатов.

G.5.8. Параметры конфигурации #

pgpro_result_cache.enable (boolean) #

Активирует функциональность расширения pgpro_result_cache. Значение по умолчанию — off. Изменить этот параметр могут только суперпользователи.

pgpro_result_cache.max_memory_size (integer, kB) #

Указывает размер разделяемой памяти, используемой для кеширования наборов результатов. Значение по умолчанию — 64kB. Этот параметр можно задать только при запуске сервера.

pgpro_result_cache.max_entries (integer) #

Устанавливает максимальное число кешированных наборов результатов. Значение по умолчанию — 128. Этот параметр можно задать только при запуске сервера.

pgpro_result_cache.max_entry_size (integer, kB) #

Задаёт максимальный объём памяти для одного набора результатов. Значение по умолчанию — 16kB. Изменять этот параметр могут только суперпользователи. Не может превышать pgpro_result_cache.max_memory_size / 2. Текст запроса хранится в памяти вместе с данными результатов, поэтому значение параметра должно быть достаточно большим для размещения обоих компонентов. Изменения параметра в работающей системе влияют только на новые кешируемые данные, не затрагивая существующие.

pgpro_result_cache.ttl (integer, s) #

Задаёт время жизни записи в кеше. Значение по умолчанию — -1 (откл.). Изменить этот параметр могут только суперпользователи.

pgpro_result_cache.min_exec_time (integer, ms) #

Задаёт минимальное время выполнения запроса. Значение по умолчанию — -1 (откл.). Положительное целое число означает, что запросы, выполняющиеся быстрее указанного времени, не будут сохраняться в кеше. Изменять этот параметр могут только суперпользователи.

G.5.9. Важные замечания #

Используя расширение pgpro_result_cache, имейте в виду следующее:

  • Расширение сохраняет в кеше результаты изменяемых функций, что приводит к возврату идентичных результатов при последующих вызовах.

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

  • Кешированные результаты игнорируют политику защиты на уровне строк. Не используйте конфиденциальные данные в запросах.