我發現了一些關於查詢的最大大小的分散信息,它在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.
我怎麼知道是什麼最大查詢大小我可以在特定情況下使用?
你會考慮重構查詢之前打其他限制?我的意思是,它可能取決於內核設置,但也許你更好地改變方法?.. –
我嘗試將每行插入查詢作爲單個命令運行,並且花費的時間更長。 –
所以你有'insert ... VALUES(),(),()...'大小爲38 MB ?,然後生成csv,然後'COPY'將會更快更安全我相信 –