Postgres Upsert-碎片问题

问题描述 投票:0回答:2

摘要

我在ETL中使用Postgres UPSERT,并且在写入的表上遇到碎片和膨胀的问题,这减慢了包括读取在内的所有操作的速度。

Context

我每小时将每小时的批处理ETL插入表中(表格〜数以百万计,upserts〜数以万计),并且我们在AWS上将自动清理设置为阈值。

我必须运行全真空,以收回空间并防止进程挂起。现在,随着我们其中一个ETL的频率增加,这种情况变得更加严重,其中填充了一些核心表,这些核心表是许多非规范化视图的来源。似乎正在发生的情况是,在下一次ETL运行之前,表没有机会被清理,从而形成了螺旋状,最终导致完全减速。

问题!

Upsert从根本上对碎片化有负面影响,如果是的话,其他人正在使用什么?我热衷于实现一些物化视图并将大多数索引移至新视图,同时仅在要写入的表上保留PK索引,但是我不确定这样做是否会解决我所看到的问题。

我已经对该问题进行了一些阅读,但没有定论,例如-> https://www.targeted.org/articles/databases/fragmentation.html

感谢您的帮助

postgresql amazon-rds database-administration upsert vacuum
2个回答
0
投票

取决于。如果没有违反约束的情况,则INSERT ... ON CONFLICT不会引起任何膨胀。如果执行更新,则会产生一个死行。

您可以采取的措施:

  • 设置autovacuum_vacuum_cost_delay = 0以获得更快的自动真空

  • 使用fillfactor略小于100,并且在更新的列上没有索引,这样您就可以进行HOT更新,从而无需使用自动真空]]


0
投票

尚不清楚您实际看到的是什么。您可以打开track_io_timing,然后为您认为已因膨胀而减慢的查询执行EXPLAIN (ANALYZE, BUFFERS)吗?

© www.soinside.com 2019 - 2024. All rights reserved.