postgresql - 提高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
在我更改配置并重新启动后,它只影响查询速度,而插入速度没有改变(~150 条记录/秒)。
我检查了我的服务器内存信息,有很多可用内存~4GB。插入器仅使用 8GB (~40MB) 的 0.5%。
所以我的问题是:
这是存储磁盘的问题,例如 SSD 和 HDD 还是虚拟和物理等?为什么我已经更改了配置,但插入速度仍然很慢?有什么办法可以提高插入速度?
注意:问题与插入查询结构无关。我在其他地方的相同条件下使用了相同的查询(我以相同的方式在 2 台服务器中设置了环境)。我不知道为什么 DEVELOPMENT 服务器 (4GB) 比 PRODUCTION 服务器 (8GB) 工作得更好。
解决方案
唯一影响INSERT
性能的参数是max_wal_size
. 高值可防止频繁的检查点。
在数据库服务器上使用iostat -x 1
以查看磁盘的繁忙程度。如果他们很忙,您可能会遇到 I/O 瓶颈。也许您的测试服务器上的 I/O 子系统更好?
如果您INSERT
在许多小事务中运行 s,您可能会遇到fsync
WAL 的瓶颈。症状是磁盘繁忙,执行的 I/O 不多。
在这种情况下,批量处理INSERT
较大事务中的 s。您观察到的差异可能是由于不同的配置:也许您在测试服务器上设置synchronous_commit
或(可怕的 dictu!) 。fsync
off
推荐阅读
- python - Python电报机器人 - 机器人可以在聊天中发送第一条消息吗?
- python-3.x - Numba jit 和 Scipy
- python - Python - 每次出现特定字符串时将文件拆分为多个文件
- javascript - API 调用了两次,而 useEffect 触发了一次。ReactJS/Javascript
- javascript - [Vue 警告]:v-on 处理程序出错:“SyntaxError: Unexpected token , in JSON at position 76”
- generics - 如何在不重复每个方法的特征绑定的情况下表达超特征关联类型的特征绑定?
- javascript - 重新排序日志文件中的数据 - Javascript
- macos - 是否可以在 Windows 10 Pro 上下载 Mac OS X Catalina?
- matlab - 如何在Matlab中将前6行和所有列设置为0
- r - 带弹性表和官员的行高