【发布时间】:2010-10-17 02:51:59
【问题描述】:
我的应用程序中有一个实用程序,我需要在其中执行插入、更新和删除操作的批量加载。我正在尝试围绕此创建事务,以便一旦调用此系统并将数据提供给它,就可以确保它要么全部添加到数据库中,要么没有添加到数据库中。
关心的是这里的边界条件是什么?一笔交易可以有多少个 INSERT、UPDATE 和 DELETE?交易大小是否可配置?
【问题讨论】:
标签: database postgresql transactions
我的应用程序中有一个实用程序,我需要在其中执行插入、更新和删除操作的批量加载。我正在尝试围绕此创建事务,以便一旦调用此系统并将数据提供给它,就可以确保它要么全部添加到数据库中,要么没有添加到数据库中。
关心的是这里的边界条件是什么?一笔交易可以有多少个 INSERT、UPDATE 和 DELETE?交易大小是否可配置?
【问题讨论】:
标签: database postgresql transactions
我认为事务中可以执行的工作量没有上限。数据不断添加到表文件中,最终事务要么提交要么回滚:AIUI 这个结果存储在 pg_clog 中;如果它回滚,空间最终会被真空回收。因此,例如,正在进行的事务工作并不是保存在内存中并在提交时刷新。
【讨论】:
.sql 文件中,我可以执行以下操作:- begin; lots of insert sql statements (around 2 million insert statements); commit;
单个事务可以在其中运行大约 20 亿条命令(2^31,减去 IIRC 一点点开销。实际上,想想看,可能是 2^32 - 我认为命令计数器是无符号的)。
当然,每个命令都可以修改多行。
【讨论】:
对于我从事的一个项目,我执行了 2000 万次 INSERT。我尝试了一笔大交易,每百万 INSERT 交易一笔,性能似乎完全一样。
PostgreSQL 8.3
【讨论】:
我相信最大工作量受您的日志文件大小的限制。数据库永远不会让自己无法回滚,因此如果您在事务期间消耗所有日志空间,它将停止,直到您给它更多空间或回滚。这对所有数据库都是如此。
我建议将您的更新分成可管理的块,最多需要几分钟的执行时间,这样您就可以更早地知道是否存在问题(例如,通常需要 1 分钟的内容在 10 分钟后仍在运行......嗯,有人删除了索引吗?)
【讨论】: