什么是INSERT ... ON CONFLICT,它首先尝试更新?

时间:2019-03-30 21:28:57

标签: postgresql upsert

我一直在使用INSERT ... ON CONFLICT DO UPDATE插入/更新数据。我的问题是,我大多数时候都想进行更新:每天更新一次计数器。如果该日期没有数据,则创建该行。这种创建只会发生一次(显然),但是更新每天可能会发生数百万次。使用INSERT ... ON CONFLICT DO UPDATE仍然是正确的方法吗?是否有等同于“尝试先更新,如果失败则插入行”的等效项? (例如实际的“ UPSERT”)。

1 个答案:

答案 0 :(得分:1)

没有UPDATE的变体具有相同的行为,原因很简单,即它会与INSERT ... ON CONFLICT做完全相同的事情。不用担心名字。

如果每天每一行都有数百万的更新,则您应该更加担心VACUUM

如果可以的话,不要索引将经常更新的属性并创建fillfactor小于100的表。您可以获得效率更高的&ldauo; HOT更新”,这将大大减少磁盘写入量和需要VACUUM

请确保通过降低autovacuum_vacuum_cost_delay来调整自动真空度,使其更具侵略性。