記憶體內 OLTP 垃圾收集

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體

如果某個不再使用的交易刪除資料列,則該資料列視為過時。 過時的資料列適合進行記憶體回收。 以下是記憶體內 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 節點中的任一非空佇列。 如果交易活動偏低且有記憶體壓力,主要垃圾回收執行緒可以存取任何佇列中的待垃圾回收資料列。 例如,如果刪除大量資料列之後沒有交易活動,而且沒有記憶體不足的壓力,則在交易活動繼續或發生記憶體不足的壓力之前,將不會對已刪除的資料列進行記憶體回收。