Существует ли ограничение максимальной длины для запроса postgres?

33

Приложение, которое мы создаем, может выполнять довольно большие запросы на вставку. Есть ли ограничение, что мой запрос postgres может содержать только определенное количество символов?

Каннан Рамамурти
источник
2
Я бы просто сказал, что если вы даже приближаетесь к каким-либо ограничениям такого рода, вам нужно пересмотреть свой дизайн. Я обнаружил, что, как правило, любые приближающиеся запросы обычно генерируются какой-то структурой (включая экстремальное сцепление строк), и они имеют тенденцию терять контакт с реальностью.
Верас

Ответы:

43

Для текущей версии PostgreSQL (до 9.5) запросы принимаются бэкэндом в Stringinfoбуфере, который ограничен MaxAllocSizeследующим образом:

#define MaxAllocSize   ((Size) 0x3fffffff) /* 1 gigabyte - 1 */

(см. http://doxygen.postgresql.org/memutils_8h.html )

Таким образом, размер запроса ограничен 1 гигабайтом (2 ^ 30), минус 1 байт для завершающего нулевого байта.

Если клиент попытается отправить запрос большего размера, появится сообщение об ошибке, похожее на это:

ОШИБКА:
недостаточно памяти. ДЕТАЛИ: Невозможно увеличить строковый буфер, содержащий 0 байтов, еще на N байтов.

где Nразмер запроса.

Имейте в виду, что запрос ниже 1GBможет потребовать синтаксического анализа, планирования или выполнения большого объема памяти в дополнение к этому 1GBбуферу.

Если вам нужно вставить в запрос большую серию литералов, рассмотрите альтернативный вариант создания временной таблицы, COPYстрок в ней и попросите основной запрос обратиться к этой временной таблице.

Даниэль Верите
источник