2017-10-13 363 views
1

我发现了一些关于查询的最大大小的分散信息,它在20mb到1GB之间变化。如何找出Postgres允许的最长查询字符串长度?

我有一个很长的查询字符串是在表中插入约200k行。在调试输出中,我看到字符串长度为39759604,大小约为38mb。

执行此查询会导致连接终止,然后数据库进入恢复模式。

如果我通过减少查询字符串中的数据来减小查询字符串的大小,查询将成功运行。

我有16Gb的RAM,看到它使用了9个。

下面是的Postgres的输出中记录:

2017-10-13 12:51:03.110 UTC [1] LOG: server process (PID 93) was terminated by signal 9: Killed 
2017-10-13 12:51:03.110 UTC [1] DETAIL: Failed process was running: INSERT INTO stats(...) VALUES ... 
2017-10-13 12:51:03.115 UTC [1] LOG: terminating any other active server processes 
2017-10-13 12:51:03.115 UTC [116] WARNING: terminating connection because of crash of another server process 
2017-10-13 12:51:03.115 UTC [116] DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory. 
2017-10-13 12:51:03.115 UTC [116] HINT: In a moment you should be able to reconnect to the database and repeat your command. 

我怎么知道是什么最大查询大小我可以在特定情况下使用?

+0

你会考虑重构查询之前打其他限制?我的意思是,它可能取决于内核设置,但也许你更好地改变方法?.. –

+0

我尝试将每行插入查询作为单个命令运行,并且花费的时间更长。 –

+0

所以你有'insert ... VALUES(),(),()...'大小为38 MB ?,然后生成csv,然后'COPY'将会更快更安全我相信 –

回答

1

我会尝试另一种方法,而不是尝试调整语句的最大长度。如果你生成语句,你可以生成csv(或者可能已经有了它)。将csv加载到表格要比多行INSERT快得多。

如果在加载数据之前需要进行一些转换,您可以将COPY FROM csv设置为临时辅助表,然后INSERT INTO orig SELECT transfor FROM temp。甚至尝试一些工具专为这样的任务,例如: http://pgloader.io/howto/pgloader.1.html

-l,--load-口齿不清文件:指定一个口齿不清读取命令之前编译并加载到pgloader图像,允许 定义额外的转换函数。这些函数应该在pgloader.transforms包中定义的 。该选项可以在命令行中多次出现 。

更新 也,回答原柱:https://dba.stackexchange.com/a/131425/30035

因此,一个查询被限制为尺寸为1千兆字节(2^30),减去一个 终止空字节1个字节。

但我认为你将在SQL长度