如果数据行已被不再处于活动状态的事务删除,则被视为过时。 过时的行就有资格进行垃圾收集。 以下是 In-Memory OLTP 中垃圾回收的特征:
非阻塞。 垃圾回收在一段时间内进行分散,对工作负荷的影响很小。
合作社。 用户事务与主垃圾回收线程一起参与垃圾回收。
有效。 用户事务将正在使用的访问路径(索引)中的过时行断开。 这可以减少最终删除行时所需的工作。
适应性强 内存压力会导致积极的垃圾回收。
可缩放。 提交后,用户事务将承担一部分垃圾回收的工作。 事务活动越多,越能将过时行解除链接。
垃圾回收由主垃圾回收线程控制。 主垃圾回收线程每分钟运行一次,或者当提交的事务数超过内部阈值时。 垃圾回收器的任务是:
识别已删除或更新一组行并且在最早的未完成事务之前提交的事务。
由这些旧事务创建的标识行版本。
将旧行分组为一个或多个单位,每个单位为 16 行。 这样做是为了将垃圾回收器的工作分发到较小的单元中。
将这些工作单元移到垃圾回收队列中,每个计划程序都有一个工作单元。 请参考有关垃圾收集器 DMV 的详细信息:sys.dm_xtp_gc_stats(Transact-SQL)、sys.dm_db_xtp_gc_cycle_stats(Transact-SQL)和sys.dm_xtp_gc_queue_stats(Transact-SQL)。
用户事务提交后,它会标识与运行该事务的计划程序关联的所有排队项,然后释放内存。 如果计划程序上的垃圾回收队列为空,则会在当前 NUMA 节点中搜索任何非空队列。 如果事务活动较低,并且存在内存压力,则主垃圾回收线程可以从任何队列访问垃圾回收行。 如果在删除大量行后且没有内存压力的情况下没有事务活动,则在事务活动恢复或存在内存压力之前,不会对已删除的行进行垃圾回收。