Postgresql 回滚到保存点是否比回滚事务性能更好?

Postgresql 回滚到保存点是否比回滚事务性能更好?,postgresql,postgresql-11,Postgresql,Postgresql 11,我有一个脚本,它根据从文件读取的数据,对一个中等大小(大约600万行)的表执行一系列更新 它当前开始,然后为它更新的每一行提交一个事务,我想以某种方式提高它的性能。我想知道在脚本运行开始时启动单个事务,然后在发生任何验证错误时回滚到各个保存点是否会实际导致性能提高 我在网上查看过,但没有找到多少文档或基准测试。只有一个提交的单个事务应该比有多个单行更新事务快,因为每个提交都必须同步WAL写入磁盘。但在给定的环境中,它到底有多快取决于很多环境(事务数、表结构、索引结构、UPDATE语句、Postg

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

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


我在网上查看过,但没有找到多少文档或基准测试。

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

只有一个提交的单个事务应该比有多个单行更新事务快,因为每个提交必须同步WAL写入磁盘。但是在给定的环境中,它的速度有多快取决于很多环境(事务数、表结构、索引结构、更新语句、PostgreSQL配置、系统配置等):只有您可以在您的环境中进行基准测试。

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

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

如果在数据库服务器崩溃的情况下(这种情况很少见),您可以接受丢失一些提交的事务,那么只需将
synchronous\u commit
设置为
off
,然后继续处理许多小事务


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

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

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

如果在数据库服务器崩溃的情况下(这种情况很少见),您可以接受丢失一些提交的事务,那么只需将
synchronous\u commit
设置为
off
,然后继续处理许多小事务


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

谢谢您的回答。不幸的是,在我的例子中,输入文件中只有一个错误就可以回滚整个事务:(感谢您的回答。不幸的是,在我的情况下,输入文件中只有一个错误就可以回滚整个事务:(您在那里处理的是什么类型的错误?可能使用
insert on conflict
会是更好的解决方案,这样您就不会在一开始就出现错误。但是如果没有看到代码,这很难回答。因为您提交了每一行,如果您的脚本中途失败(例如,断电),您将如何确定在何处重新拾取?答案决定了您拥有的选项范围。您正在处理哪种类型的错误?也许使用
insert on conflict
将是一个更好的解决方案,这样您一开始就不会出现错误。但如果没有看到代码,这很难回答。因为您提交了each行,如果您的脚本在中途失败(比如停电),您将如何确定在何处重新启动?答案取决于您拥有的选项范围。