缓慢的并发postgres插入具有索引的单独表中

问题描述

我遇到一个问题,我有24个插入查询,所有插入查询都插入到不同的表(分片)中,并且在同时执行插入操作时它们运行缓慢。当我按顺序运行它们时,它们的运行速度非常快。奇怪的是,所有这些都插入到其他物理表中,所以我不知道这种严重的竞争将来自何处。我正在使用citus,因此我非常希望看到性能并行插入到不同的碎片中。但是我99%的确定问题不是特定于柑橘的。

所有24个查询的格式如下:

INSERT INTO schema.rtsepezocoav_p_452_119046 AS citus_table_alias (se_id,pe_id,zo_id,co_id,value_num,ad_id) SELECT ...
INSERT INTO schema.rtsepezocoav_p_452_119040 AS citus_table_alias (se_id,ad_id) SELECT ...

rtsepezocoav_p_452是父表rtsepezocoav的分区(声明性分区)

它们都向包含2Mio记录的表(分片)中插入大约100k条新记录。

所有表上都有3个btree索引。我知道插入具有索引的表会使速度变慢,但我不了解的是同时执行这些插入时性能会严重下降...

当我依次运行它们时,它们都花费不到2秒的时间:

Timing is on.
INSERT 0 94052
Time: 1860.400 ms (00:01.860)
Timing is on.
INSERT 0 95136
Time: 1798.271 ms (00:01.798)
...

当我并行触发24个查询时(通过在终端中以'&'结尾的psql命令),它们花费的时间更长:大约13秒。

INSERT 0 94052
Time: 12234.630 ms (00:12.235)
INSERT 0 95136
Time: 13207.503 ms (00:13.208)
INSERT 0 96049
Time: 13481.625 ms (00:13.482)
INSERT 0 93804
Time: 13684.117 ms (00:13.684)
INSERT 0 97342
Time: 14657.759 ms (00:14.658)

当我不进行插入操作时,我只是并行计算(1),我看不到任何并发问题,所以问题出在书面上。

我正在使用具有250GB内存和12个内核的机器上的postgres12。

我尝试使用postgres设置,但是无济于事。一些可能最相关的设置:

shared_buffers  64000MB
temp_buffers    80MB
work_mem    100MB
maintenance_work_mem    2GB
wal_buffers 16MB
effective_cache_size    192000MB
min_wal_size    1GB
max_wal_size    4GB
synchronous_commit  off

当我运行标准pgbench测试时,最后一个调整似乎可以提高性能。但是对于我的实际查询,我看不出任何区别。

我缺少某些设置吗?我真的希望Postgres可以在不插入插入内容的同一张表时顺利处理同步插入内容

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)