我遇到了一个问题,我有 24 个插入查询,它们都插入到不同的表(分片)中,并且当插入同时执行时它们运行缓慢。当我按顺序运行它们时,它们非常快。奇怪的是,这些都插入到其他物理表中,所以我不明白这种严重的争用来自哪里。我正在使用 citus,所以我真的很想看到并行插入不同分片的性能提升。但我 99% 确定问题不是特定于 citus 的。
所有 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, pe_id, zo_id, co_id, value_num, ad_id) SELECT ...
rtsepezocoav_p_452 是父表 rtsepezocoav 的分区(声明式分区)
它们都将大约 10 万条新记录插入到包含大约 2Mio 记录的表(分片)中。
所有表都有 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),我没有看到任何并发问题,所以问题出在书面上。
我在 postgres12 上,在一台 250GB 内存和 12 个内核的机器上。
我尝试过使用我的 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 能够在不触及插入结束的同一张表时顺利处理同步插入......