ROLLBACK TO SAVEPOINT 是否比 ROLLBACK TRANSACTION 性能更好?

Is ROLLBACK TO SAVEPOINT better performing than ROLLBACK TRANSACTION?

我有一个脚本可以根据从文件中读取的数据对中等大小(大约 600 万行)table 执行一系列更新。

它目前开始,然后为它更新的每一行提交一个事务,我想以某种方式提高它的性能。我想知道在脚本 运行 的开头启动单个事务,然后回滚到各个保存点以防发生任何验证错误是否真的会提高性能。

我在网上查看过,但没有找到任何文档或基准。

只有 1 个 COMMIT 的单个事务应该比多个单行更新事务更快,因为每个 COMMIT 都必须同步 WAL 写入磁盘。但是在给定环境中它到底有多快取决于很多环境(交易数量、table 结构、索引结构、UPDATE 语句、PostgreSQL 配置、系统配置等):只有你可以在你的环境中进行基准测试.

COMMIT 主要是 I/O 问题,因为事务日志 (WAL) 必须同步到磁盘。

因此使用子事务(保存点)很可能会提高性能。但请注意,如果您有并发事务,则每个事务使用超过 64 个子事务将再次损害性能。

如果您可以忍受在数据库服务器崩溃时丢失一些已提交的事务(这种情况很少见),您可以简单地将 synchronous_commit 设置为 off 并坚持使用许多小事务。

另一种更复杂的方法是在不使用子事务的情况下分批处理行,并在出现问题时重复整个批处理。