2017-10-13 87 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長度