在 PostgreSql 中批量更新或删除哪个更高效?
Posted
技术标签:
【中文标题】在 PostgreSql 中批量更新或删除哪个更高效?【英文标题】:In PostgreSql which is more efficient bulk Update or delete? 【发布时间】:2019-11-07 18:50:12 【问题描述】:在我的 java web 应用程序中,我需要从表中删除一组记录。我有两个选择:
-
直接从应用程序运行删除查询
更新所有记录中的值以将它们从用户视图中隐藏,并让守护线程运行并在后台清理这些记录。
记录数的范围可以从 10 到 100000。 我的目的是了解在不给服务器增加过多负载的情况下实现这一点的有效且安全的方法。
P.S.:随意分享任何其他合适的方法。
【问题讨论】:
【参考方案1】:实际上,UPDATE
是:
-
将更新的行标记为已删除
插入新行,这是上面 1. 中行的副本,但反映了更新的列
因此,由于UPDATE
操作涉及两次写入,DELETE
实际上更有效,因为它仅使用一次写入标记已删除的行(因为多版本并发控制 (MVCC) 框架)
披露:我为EnterpriseDB (EDB)工作
【讨论】:
【参考方案2】:与删除命令相比,更新命令需要更多时间。在更新中,您实际上是在制作数据的副本,而旧版本的数据只是隐藏在视图中。
【讨论】:
【参考方案3】:如果以后需要这些记录,可以将这些记录移到另一个表中。
这种方法的优点是:-
-
您没有超载当前表,因此该表的所有操作都会很快。
您以后可以使用这些记录。
更新
由于您不需要记录并且更新比删除更昂贵,您应该分批发出删除调用,比如说 500 到 5000 条记录。
【讨论】:
不,我以后不需要这些记录了。 如果您以后不需要这些,您应该删除所有可以批量删除的记录,您的批次中有 500 到 5000 条记录。以上是关于在 PostgreSql 中批量更新或删除哪个更高效?的主要内容,如果未能解决你的问题,请参考以下文章
SQLAlchemy - 在 postgresql 中执行批量 upsert(如果存在,更新,否则插入)
在 postgreSql 上使用 ParameterizedPreparedStatementSetter 与 BatchPreparedStatementSetter 进行批量更新?