我有一个大的PostgreSQL表 - 280万行; 2345 MB大小; 49列,主要是短VARCHAR字段,但有一个大的json字段。
它运行在具有4GB RAM的Ubuntu 12.04 VM上。
当我尝试对此表执行SELECT *时,我的psql连接终止。查看错误日志,我得到:
2014-03-19 18:50:53 UTC LOG: could not send data to client: Connection reset by peer
2014-03-19 18:50:53 UTC STATEMENT: select * from all;
2014-03-19 18:50:53 UTC FATAL: connection to client lost
2014-03-19 18:50:53 UTC STATEMENT: select * from all;
为什么会这样?是否有可传输的最大数据量或其他东西 - 并且可以在postgres中配置吗?
有一个宽大的表由我们使用的系统决定(我知道它不是一个理想的DB结构)。 postgres可以处理这种规模的表格,还是会遇到问题?
感谢您的帮助, 本
答案 0 :(得分:4)
服务器日志中的那些消息只是意味着客户端意外地离开了。在这种情况下,它可能因内存不足而死亡。
默认情况下,psql会在显示任何内容之前将整个结果加载到内存中。这样,它可以最好地决定如何格式化数据。您可以通过设置FETCH_COUNT
来更改该行为答案 1 :(得分:0)
我已经看到了类似的问题,但是,我遇到的问题不在客户端,而是很可能在postgres驱动程序方面。该查询需要获取大量行,因此,postgres驱动程序可能存在临时内存峰值要求。结果,我用来获取记录的光标关闭了,我得到了完全相同的日志。
如果有人确认这是否可能,我真的很乐意,有一点我确信客户端没有任何问题。