我发现了一些关于查询最大大小的零散信息,从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.
我如何知道在特定情况下我可以使用的最大查询大小?
答案 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长度之前达到其他限制