PostgreSQL连接重置大表

时间:2014-03-19 19:15:04

标签: postgresql

我有一个大的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可以处理这种规模的表格,还是会遇到问题?

感谢您的帮助, 本

2 个答案:

答案 0 :(得分:4)

服务器日志中的那些消息只是意味着客户端意外地离开了。在这种情况下,它可能因内存不足而死亡。

默认情况下,psql会在显示任何内容之前将整个结果加载到内存中。这样,它可以最好地决定如何格式化数据。您可以通过设置FETCH_COUNT

来更改该行为

答案 1 :(得分:0)

我已经看到了类似的问题,但是,我遇到的问题不在客户端,而是很可能在postgres驱动程序方面。该查询需要获取大量行,因此,postgres驱动程序可能存在临时内存峰值要求。结果,我用来获取记录的光标关闭了,我得到了完全相同的日志。

如果有人确认这是否可能,我真的很乐意,有一点我确信客户端没有任何问题。