如何找出Postgres允许的最长查询字符串长度?

时间:2017-10-13 12:46:55

标签: postgresql

我发现了一些关于查询最大大小的零散信息,从20mb到大于1gb不等。

我有一个很长的查询字符串,用于在表中插入大约200,000行。在调试输出中,我看到字符串长度为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.

我如何知道在特定情况下我可以使用的最大查询大小?

1 个答案:

答案 0 :(得分:1)

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

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

  

-l, - load-lisp-file:在读取命令之前指定要编译并加载到pgloader映像的lisp,允许   定义额外的转换功能。那些功能应该是   在pgloader.transforms包中定义。此选项可以出现   在命令行中不止一次。

<强>更新 还回答了原帖:https://dba.stackexchange.com/a/131425/30035

  

因此查询的大小限制为1千兆字节(2 ^ 30),减去1字节   终止空字节。

但我认为你会在SQL长度之前达到其他限制