【问题标题】:Increase data insert speed of PostgreSQL提高PostgreSQL的数据插入速度
【发布时间】:2019-03-04 01:04:42
【问题描述】:

我遇到了 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

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

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

所以我的问题是:

这是存储磁盘的问题,例如 SSD 和 HDD 还是虚拟 和物理等?为什么我已经更改了配置,但插入速度仍然很慢?有没有什么办法 提高插入速度?

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

【问题讨论】:

  • 您是否在前端的循环中一次插入一行?
  • 是的,我做到了,我正在考虑使用 1000 个插入表达式的 1000 个数据行与只有 1 个插入表达式的 1000 个数据行相比,哪一个更好。但是,通过使用 ON CONFLICT 而不是另一个,它看起来像单独使用一个表达式很容易控制重复插入的数据。你有什么想法吗?

标签: postgresql centos centos7 postgresql-9.5


【解决方案1】:

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

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

如果你在许多小事务中运行INSERTs,你可能会被fsync 瓶颈到WAL。症状是磁盘繁忙,执行的 I/O 不多。

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

【讨论】:

  • 我使用iostat 命令检查。结果是: 生产:%user:~10 %iowait:~40 %idle:~40% 开发:%user:~10 %iowait:~16 %idle:~75%
  • wkB/s 完全不同:~1000 wkB/s 用于生产,~5000wkB 用于开发
  • 是的,您显然受 I/O 限制。所以我的回答应该会有所帮助。
  • 非常感谢。现在我知道是什么问题了
猜你喜欢
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 2016-01-26
相关资源
最近更新 更多