提高 PostgreSQL 的数据插入速度

Increase data insert speed of PostgreSQL

我遇到了PostgreSQL数据写入很慢的问题

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

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

我更改配置重启后,只影响查询速度,插入速度没有变化(~150records/s)。

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

所以我的问题是:

这是存储盘的问题,比如SSD和HDD或者虚拟机 和身体等?为什么我改了配置,插入速度还是很慢?有什么办法 为了提高插入速度?

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

您的唯一一个对 INSERT 性能有影响的参数是 max_wal_size。高值可防止频繁检查点。

在数据库服务器上使用 iostat -x 1 查看您的磁盘有多忙。如果他们很忙,您可能 I/O 遇到了瓶颈。也许您的测试服务器上的 I/O 子系统更好?

如果您在许多小事务中是 运行 个 INSERT,您可能会受到 fsync 到 WAL 的瓶颈。症状是磁盘繁忙,执行的内容不多 I/O。

在这种情况下,将 INSERT 分批处理成较大的事务。您观察到的差异可能是由于不同的配置造成的:也许您在测试服务器上将 synchronous_commit 或(可怕的 dictu!)fsync 设置为 off