在一个事务或多个事务中使用Postgres长SQL脚本?

在一个事务或多个事务中使用Postgres长SQL脚本?,sql,postgresql,transactions,Sql,Postgresql,Transactions,如果我有这样的剧本 DROP TABLE IF EXISTS my_table; CREATE TABLE my_table AS SELECT * FROM some_other_table JOIN example_table USING (some_column); lots more code... this all takes an hour to run -- I raise an exception SELECT raise_exception_function(); 我的观

如果我有这样的剧本

DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table AS
SELECT *
FROM some_other_table
JOIN example_table USING (some_column);

lots more code... this all takes an hour to run

-- I raise an exception
SELECT raise_exception_function();
我的观点是,该脚本构建了许多表,并进行了更新和各种各样的操作,这些操作需要一个多小时才能运行

这一切都是在一个事务中完成的,当最后的函数运行并引发异常时。所有这些小时的工作都将被撤销,因此我认为Postgres必须将这些更改存储在内存中,这将降低服务器的运行速度

那么,将这个长查询拆分并作为单个事务运行会更好吗?当然,这是假设我不关心回滚事务以使更改生效的好处


与许多较小的事务相比,使用一个长事务是否会占用更多的系统资源?

使用更多事务将减少在日志中存储中间结果的开销,如果您不关心事务语义,这可能是一个好主意。我将以注释的形式写这篇文章,但我还没有这个名声。如果只是显示两个表的联接结果,您是否考虑过使用视图?我不担心这一点,除非您有证据证明长时间运行的事务是一个问题。在此之前,按照您需要的方式定义事务。如果开始出现问题,我宁愿尝试调整脚本的运行时,也不愿放弃事务边界。服务器同时运行多种类型的“报告”,因此可用内存是我非常关心的问题。