Пакетное чтение строк PostgreSQL по первичному ключу

Руководство показывает, как пакетный RESP MGET избавляет от отдельного запроса к базе для каждого ключа и сохраняет позиции результатов.

Избавьтесь от чтений N+1

Если приложение читает по одной строке для каждого ID, после начального запроса оно выполняет N чтений источника. Соберите известные первичные ключи в один MGET, чтобы отправить ограниченный пакетный запрос. Это подходит для повторного чтения целых строк, но не кэширует произвольный SQL и не заменяет соединения и проекции.

Контракт результата

MGET key [key ...] возвращает по одному элементу массива на каждый входной ключ в исходном порядке. Дубликаты сохраняются. Для отсутствующих строк возвращаются элементы nil. Формат ключа: CRUD:<db>.<schema>.<table>:<json pk>; кодирование и примеры приведены в разделе RESP-клиенты.

Когда подходит MGET

Одна команда принимает до 1 024 ключей. Размер закодированного ответа ограничен 66 560 байтами, поэтому для крупных строк может понадобиться уменьшить пакет и при небольшом числе ключей. Разбивайте запросы с учётом и числа ключей, и ожидаемого размера данных. Слишком большой ответ вернёт ошибку, а не частичный массив.

Обычный SQL лучше подходит для фильтров, соединений, блокировок строк, проекций и чтения в общей транзакции. Сравнение исходного запроса и RESP описано в руководстве по инвалидации кэша и технической справке.

В 3.0.0 удалена SQL-функция local_cache.mget(regclass, anyarray) из версии 2.x; см. руководство по обновлению.

Обновлено .