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
并坚持使用许多小事务。
另一种更复杂的方法是在不使用子事务的情况下分批处理行,并在出现问题时重复整个批处理。
我有一个脚本可以根据从文件中读取的数据对中等大小(大约 600 万行)table 执行一系列更新。
它目前开始,然后为它更新的每一行提交一个事务,我想以某种方式提高它的性能。我想知道在脚本 运行 的开头启动单个事务,然后回滚到各个保存点以防发生任何验证错误是否真的会提高性能。
我在网上查看过,但没有找到任何文档或基准。
只有 1 个 COMMIT 的单个事务应该比多个单行更新事务更快,因为每个 COMMIT 都必须同步 WAL 写入磁盘。但是在给定环境中它到底有多快取决于很多环境(交易数量、table 结构、索引结构、UPDATE 语句、PostgreSQL 配置、系统配置等):只有你可以在你的环境中进行基准测试.
COMMIT
主要是 I/O 问题,因为事务日志 (WAL) 必须同步到磁盘。
因此使用子事务(保存点)很可能会提高性能。但请注意,如果您有并发事务,则每个事务使用超过 64 个子事务将再次损害性能。
如果您可以忍受在数据库服务器崩溃时丢失一些已提交的事务(这种情况很少见),您可以简单地将 synchronous_commit
设置为 off
并坚持使用许多小事务。
另一种更复杂的方法是在不使用子事务的情况下分批处理行,并在出现问题时重复整个批处理。