Приложение, которое мы создаем, может выполнять довольно большие запросы на вставку. Есть ли ограничение, что мой запрос postgres может содержать только определенное количество символов?
Приложение, которое мы создаем, может выполнять довольно большие запросы на вставку. Есть ли ограничение, что мой запрос postgres может содержать только определенное количество символов?
Ответы:
Для текущей версии 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строк в ней и попросите основной запрос обратиться к этой временной таблице.