Кэш строк PostgreSQL и shared_buffers
В этом руководстве сравниваются кэширование страниц PostgreSQL и кэширование целых строк в pg_local_cache; также описано, что остаётся делать при каждом пути чтения.
shared_buffers хранит страницы базы данных в памяти. Попадание на тёплую страницу позволяет избежать чтения с диска, но PostgreSQL по-прежнему проверяет видимость кортежей, выполняет запрос и формирует результат. При попадании в кэш подходящая команда RESP MGET может вернуть сохранённую полезную нагрузку целой строки после проверки ключа, поколения fence и полезной нагрузки.
Описание пути чтения приведено в техническом справочнике.
Кэширует ли PostgreSQL результаты SELECT?
Нет. Кэш страниц PostgreSQL хранит страницы, а не окончательные результаты запросов. Подготовленный оператор может повторно использовать результаты разбора и планирования; сам запрос PostgreSQL всё равно выполняет. pg_local_cache предоставляет кэширование целых строк через RESP MGET, а не кэширование произвольных запросов SELECT. См. раздел о клиентах RESP.
Сравнивайте работу, а не только среду хранения
| Путь чтения | Что остаётся сделать |
|---|---|
| Подготовленный SQL-запрос по первичному ключу для тёплых страниц | Обработка протокола, выполнение запроса, проверка видимости и преобразование результата |
Попадание в кэш при допустимом RESP MGET |
Обработка протокола, преобразование ключа, синхронизация кэша, проверки допустимости и возврат полезной нагрузки |
| Промах или обход кэша в RESP | Проверка кэша и чтение исходной таблицы; подходящие строки могут быть помещены в кэш |
Попадание в кэш позволяет не повторять выполнение запроса к исходной таблице и сериализацию целой строки. При этом всё ещё используются воркер PostgreSQL и синхронизация кэша. Запросы RESP выполняются независимо от SQL-транзакции вызывающей стороны.
Учтите затраты
Строки и состояние сопоставлений занимают дополнительную общую память. Запись в подключённые таблицы запускает триггеры инвалидации. Если рабочий набор больше ёмкости кэша, может увеличиться число промахов и вытеснений.
Измеряйте оба пути на одном наборе ключей, с одинаковой формой строк, числом подключений и составом запросов. Не объединяйте пакетный SQL с чтением одной строки: пакетная обработка сама по себе может сократить число сетевых обращений без кэша.
Когда приложение лучше оставить как есть
Оставьте обычный SQL, если его сквозная задержка приемлема, приложению нужна только проекция или основную нагрузку создают соединения, диапазонные запросы и агрегирование. Используйте SQL для блокировок строк и чтения, которое должно выполняться в одной транзакции.
Кэш строк или внешний кэш?
Используйте pg_local_cache, если источником истины остаётся PostgreSQL, а целые строки часто читаются по первичному ключу. Внешний кэш подходит для состояния приложения с TTL, pub/sub, распределённой координации или объектов, общих для нескольких сервисов. Граница безопасности RESP описана в техническом справочнике.
Обновлено .