提高PostgreSQL的数据插入速度

时间:2018-09-28 04:43:45

标签: postgresql centos centos7 postgresql-9.5

我陷入了PostgreSQL数据写入非常慢的问题。

我用Java开发了我的应用程序(使用JDBC),以将数据插入PostgreSQL DB。它在我们的远程开发服务器上运行良好。但是,将其部署到生产服务器后,会引起问题。

PostgreSQL在生产服务器上的插入速度仅为~150 records/s for 200000K records,而在开发服务器上的插入速度为~1000 records/s for the same data set

首先,我尝试如下更改postgresql.conf中的配置:

effective_cache_size = 4GB
max_wal_size = 2GB
work_mem = 128MB
shared buffers = 512MB

更改配置并重新启动后,它只会影响查询速度,而插入速度却不会改变(〜150条记录/秒)。

我检查了我的服务器内存信息,有很多可用内存〜4GB。插入程序仅使用8GB(〜40MB)的0.5%。

所以我的问题是:

这是存储磁盘(例如SSD和HDD或虚拟磁盘)的问题吗? 和身体等?尽管更改了配置,为什么插入速度仍然很慢?有什么办法吗 用于提高插入速度?

注意:该问题与插入查询结构无关。 我在其他地方的相同条件下使用了相同的查询(我设置了一个 环境以相同的方式在2个服务器中)。我不知道为什么 开发服务器(4GB)的性能比PRODUCTION服务器更好 (8GB)。

1 个答案:

答案 0 :(得分:1)

您唯一影响INSERT性能的参数是max_wal_size。较高的值会阻止频繁的检查点。

在数据库服务器上使用iostat -x 1来查看磁盘的繁忙程度。如果他们很忙,则可能是I / O瓶颈。也许测试服务器上的I / O子系统更好?

如果您在许多小事务中运行INSERT,则fsync可能会成为WAL的瓶颈。症状是磁盘忙,没有执行太多的I / O。

在这种情况下,批量交易中的INSERT分批处理。那么,您观察到的差异可能是由于不同的配置所致:也许您在测试服务器上将synchronous_commit或(可怕的结论!)fsync设置为off