Firebird 2.0 垃圾回收器
引擎知道由update\delete语句产生的每个记录版本,并且可以在最旧快照事务(OST)允许时立即移除它们。这消除了用户请求(例如SELECT COUNT(*) FROM table)再次读取包含这些版本的页面的需要,并避免了这些版本永远不会被读取的情况(当然,sweep始终会移除所有未使用的记录版本)。此外,所需页面很可能仍驻留在缓冲区缓存中,因此额外的磁盘I/O更少。
在通知垃圾收集器有关包含未使用版本的页面与垃圾收集器读取该页面之间,新事务可能更新记录,如果该新事务号高于OST或仍处于活动状态,则垃圾收集器无法清理该记录。在这种情况下,引擎再次使用该页面号通知垃圾收集器,它将在稍后的某个时间清理垃圾(旧的垃圾收集器将“忘记”该页面,直到用户再次读取它)。
现在协作式和后台垃圾收集都成为可能。为此引入了新的配置参数“GCPolicy”。它可以设置为:
-
a) cooperative - 垃圾收集仅在协作模式下执行,例如在IB6之前。每个用户请求负责移除未使用的记录版本。这就是引擎在IB6之前的工作方式。这是Classic Server模式的唯一选项。引擎不跟踪由update和delete语句产生的结果版本
-
b) background - 垃圾收集仅由后台线程执行,例如在IB6及以后版本中。用户请求不移除未使用的记录版本。相反,用户请求使用检测到未使用记录版本的页面号通知专用的垃圾收集器线程。引擎还会记住update\delete语句创建后版本所在的页面号。
-
c) combined - 同时执行后台和协作式垃圾收集。
默认值为SuperServer的“combined”。ClassicServer忽略此参数,始终以“cooperative”模式工作