postgresql - Postgres Upsert - 碎片问题
问题描述
概括
我在我们的 ETL 中使用 Postgres UPSERT,我在写入的表上遇到了碎片和膨胀问题,这会减慢包括读取在内的所有操作。
语境
我每小时将批量 ETL 更新插入到表中(表 ~ 数百万,upsert ~ 数万),并且我们在 AWS 上将自动真空设置为阈值。
我不得不运行 FULL Vacuums 以收回空间并防止进程挂起。随着我们其中一个 ETL 的频率增加,这种情况现在更加严重,它填充了一些核心表,这些表是许多非规范化视图的来源。似乎正在发生的事情是,在下一次 ETL 运行之前,表没有机会被清空,从而产生了一个最终导致完全减速的螺旋。
问题!
Upsert 是否从根本上对碎片化产生负面影响,如果是,其他人在使用什么?我热衷于实现一些物化视图并将我们的大部分索引移动到新视图,同时只保留我们正在写入的表上的 PK 索引,但我不相信这会解决我看到的膨胀问题.
我已经对该问题进行了一些阅读,但没有任何结论,例如 --> https://www.targeted.org/articles/databases/fragmentation.html
谢谢你的帮助
解决方案
这取决于。如果没有违反约束,INSERT ... ON CONFLICT
不会导致任何膨胀。如果它执行更新,它将产生一个死行。
您可以采取的措施:
设置
autovacuum_vacuum_cost_delay = 0
为更快的自动真空使用
fillfactor
略小于 100 并且在更新的列上没有索引,以便您可以获得 HOT 更新,这使得 autovacuum 不必要
推荐阅读
- python - 将一个列表中的行替换为另一个列表中的一行
- python - np.linalg.inv() 函数的 pyspark 实现是什么
- angularjs - 如何使用 Authorize.net 在灯箱中显示付款方式 接受 Ionic 中的托管付款?
- yugabyte-db - 如何使用 systemd 运行 YugabyteDB?
- r - 对行进行分组,直到满足某些条件
- splunk - 如何检查 splunk 是否已收到来自 100 个不同主机的日志
- docker - 我如何确定我从 docker 中提取了一个受信任的图像?
- python - 如何将 csv 转换为 json 并用“|”分隔
- elasticsearch - searchick reindex 返回 "Faraday::TimeoutError","Net::ReadTimeout"
- javascript - 仅显示 React 中的现有元素