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