使用 'Commit Retaining' 会影响 Firebird 的性能吗?

Does using 'Commit Retaining' impair Firebird performance?

下面引用的摘录在这一点上似乎是矛盾的。

(我觉得它们都很老了,第二个是2004年的,第一个提到Borland所以也很老,所以可能已经过时了。)

第一个似乎表明提交保留会使事务保持活动状态,因此会保留 OIT。

第二个,如果我理解它意味着保留提交,现有的 TID 被标记为已提交并且事务保持活动状态但具有新的 TID,因此不会保留 OIT。第二个摘录与Interbase有关,我不知道这是否解释了表面上的矛盾。

Firebird Documentation 摘录:

With Firebird (and InterBase), Commit Retaining causes transactions to remain interesting indefinitely. Garbage collection effectively ceases on the “standard” Borland RAD tools database application and any other applications that make use of Commit Retaining.

Embarcadero Blog post 提取

Read committed, read-write:

This transaction can run forever with no negative impact on performance if you do a commit retaining from time to time.

当您在 Firebird 中使用提交保留(使用 API 或 COMMIT RETAIN)时,启动的事务并没有真正结束,它只是与一组可见事务相关联已在内部启动的新事务,同时还保持旧事务处于活动状态。

这意味着最旧的有趣事务和最旧的活动事务不会移动,并且旧版本会累积,直到事务真正提交后才能被垃圾回收。这意味着最终查询将需要扫描更长的记录版本链,这会对性能产生影响。

我假设有一些可能的优化,例如,如果没有在事务中启动的游标打开,则原始事务可能被标记为已提交(提交保留的一个特性是游标不是在事务提交时关闭,如果我没记错的话,这需要旧的事务上下文保持可用)。这可能是 InterBase 为读取已提交事务所做的事情。

这可以通过启动 isql 会话并结合提交保留执行一些插入来自己看到:如果结合检查 gstat -h,您会注意到最旧的有趣事务和最旧的活动事务不在你真正承诺之前不要移动。