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'
Обратите внимание, что имена библиотек в переменной
shared_preload_libraries
должны добавляться в определённом порядке. Совместимость pgpro_result_cache с другими расширениями описана в Подразделе G.5.4.Перезагрузите сервер баз данных, чтобы изменения вступили в силу.
Чтобы убедиться, что библиотека
pgpro_result_cache
установлена правильно, выполните следующую команду:SHOW shared_preload_libraries;
Создайте расширение
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
Имя | Тип | Описание |
---|---|---|
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.6.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 (integer , kB ) |
entries | bigint | Текущее число записей в кеше, включая устаревшие (если они не были удалены), ограниченное pgpro_result_cache.max_entries (integer ) |
hits | bigint | Число успешных извлечений из кеша |
inserts | bigint | Число новых записей, включая замены устаревших |
evicts | bigint | Записи, вытесненные по алгоритму LRU (давно неиспользуемые) при достижении лимита max_entries |
cleanups | bigint | Дополнительные записи, удалённые для соблюдения ограничения max_memory_size |
not_cached | bigint | Запросы, исключённые из кеширования (из-за высокой скорости выполнения, большого размера или иных причин) |
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
/ 2pgpro_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, включая случаи, когда транзакцию отменили, не подтвердили или изменили другие пользователи. Последующие запросы будут возвращать первоначальный кешированный результат, даже если вводные данные изменились.
Кешированные результаты игнорируют политику защиты на уровне строк. Не используйте конфиденциальные данные в запросах.