我们正在构建的应用程序可能会执行很大的插入查询。我的postgres查询只能有一定数量的字符吗?

评论

我只想说,如果您甚至正在接近这种性质的任何限制,则需要重新考虑您的设计。我发现,通常,任何即将关闭的查询通常都是由某种框架(涉及极端字符串连接)生成的,它们往往与现实失去联系。

#1 楼

对于当前的PostgreSQL版本(最高9.5),后端在Stringinfo缓冲区中接收查询,该缓冲区限于MaxAllocSize,缓冲区定义为:

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


(请参见http ://doxygen.postgresql.org/memutils_8h.html)

因此,查询的大小限制为1 GB(2 ^ 30),负1字节表示终止的空字节。
如果客户端尝试发送更大的查询,则会出现如下错误:


错误:内存不足
详细信息:无法扩大字符串缓冲区包含0个字节乘以N个字节。


其中N是查询的大小。除了该1GB缓冲区之外,还需要解析,计划或执行内存。如果需要将大量文字量推入查询中,请考虑创建一个临时表1GB行到并让主查询引用该临时表。

评论


@Quandary:我看不到您指的是什么变化。 stringinfo.h当前表示“ StringInfo提供了可扩展的字符串数据类型(当前限制为1GB的长度)”

–丹尼尔·韦里特(DanielVérité)
20年6月16日15:12

我指的是stackoverflow.com/questions/4936731/…-但我从2011年开始看到此帖子-如果现在有1GB,那么它似乎已经缩短了,没有扩展。我的错是不看日期。 PS:MaxAllocSize现在在github.com/postgres/postgres/blob/master/src/common/中定义,并在其中注明:/ *可能我们可以在前端代码中为此使用不同的值* /

–四进制
20 Jun 17'下午6:39



@Quandary:有趣,我不会以为它是2GB,但我仍然持怀疑态度。我将进行一些研究并更新答案。

–丹尼尔·韦里特(DanielVérité)
20年6月17日在8:34

我不确定,一开始可能只是来自SO的虚假信息。

–四进制
20年6月17日在10:25