【发布时间】:2020-01-14 11:52:33
【问题描述】:
总结
我在我们的 ETL 中使用 Postgres UPSERT,我在写入的表上遇到了碎片和膨胀问题,这会减慢包括读取在内的所有操作。
上下文
我每小时将批量 ETL 更新插入到表中(表 ~ 数百万,upsert ~ 数万),我们在 AWS 上将自动清理设置为阈值。
我不得不运行 FULL Vacuums 以收回空间并防止进程挂起。随着我们其中一个 ETL 的频率增加,这种情况现在更加严重,它填充了一些核心表,这些表是许多非规范化视图的来源。 似乎正在发生的事情是,在下一次 ETL 运行之前,表没有机会被清空,从而产生了最终导致完全减速的螺旋。
问题!
Upsert 是否从根本上对碎片化产生负面影响?如果是,其他人在使用什么?我热衷于实现一些物化视图并将我们的大部分索引移动到新视图,同时只保留我们正在写入的表上的 PK 索引,但我不相信这会解决我看到的膨胀问题.
我对这个问题做了一些阅读,但没有任何结论,例如 --> https://www.targeted.org/articles/databases/fragmentation.html
感谢您的帮助
【问题讨论】:
-
@LaurenzAlbe 在下面给出了很好的建议。此外,请确保没有长时间运行的事务会阻止 autovacuum 清理表。
-
“自动吸尘器设置为阈值”这是什么意思?
-
@jjanes 我的意思是说,在 AWS 中适当地设置了真空阈值。具有非常低比例因子的大表,具有合理的阈值以避免不得不清理小表。
标签: postgresql amazon-rds database-administration upsert vacuum