Postgresql 截断和插入vs更新的性能

Postgresql 截断和插入vs更新的性能,postgresql,Postgresql,我有一个超过100万条记录的表,并且表每天都在增长。我需要每天更新该表的两列。截断表并按行插入或更新的最佳方法是什么 例如:- 今天 明天 userid activitycount 1 19 截断表并再次复制它的速度更快。在Postgres文档中,您可以学习具有大数据集的表格: 本节包含一些关于如何使此过程尽可能高效的建议 使用:使用“复制”在一个命令中加载所有行,而不是使用一系列“插入”命令 删除索引:如果需要索引,只需在插入数据后创建索引即可 删除外键约束:在已插入

我有一个超过100万条记录的表,并且表每天都在增长。我需要每天更新该表的两列。截断表并按行插入或更新的最佳方法是什么

例如:-

今天

明天

userid  activitycount
1        19   

截断表并再次复制它的速度更快。在Postgres文档中,您可以学习具有大数据集的表格:

本节包含一些关于如何使此过程尽可能高效的建议

  • 使用:使用“复制”在一个命令中加载所有行,而不是使用一系列“插入”命令
  • 删除索引:如果需要索引,只需在插入数据后创建索引即可
  • 删除外键约束:在已插入数据时创建约束
  • 调整Postgres安装:维护工作内存、最大wal大小、禁用wal存档和流式复制

确保表的
fillfactor
小于50,并且更新的列没有索引

然后更新将成为不需要修改任何索引的热更新,autovacuum将确保明天的更新将找到足够的可用空间


缺点是使用此方法时会出现膨胀,但您不需要创建新表并重命名它们,这可能会对并发事务造成问题。

我会更改应用程序逻辑,这样您就不需要每天更新100多万行。很抱歉这么糟糕的建议,但我觉得我必须写出来……找到答案的最好方法是对它进行基准测试。无论采用哪种方式编写查询,都是一个相当短的查询,因此简单地测试运行它是完全合理的。因此,您也会丢失存储在表的其他列中的信息,无法再进行更新。我不明白你怎么会认为truncate是更新的替代方法。@a_horse_,没有名称。用例是我必须根据用户活动创建一个汇总表。即使截断并重新加载,也不会影响其他行。
userid  activitycount
1        19