インメモリ OLTP ガベージ コレクションIn-Memory OLTP Garbage Collection

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

アクティブでなくなったトランザクションで削除されたデータ行は古いと見なされます。A data row is considered stale if it was deleted by a transaction that is no longer active. 古い行は、ガベージ コレクションに適しています。A stale row is eligible for garbage collection. インメモリ OLTPIn-Memory OLTPのガベージ コレクションには、次のような特性があります。The following are characteristics of garbage collection in インメモリ OLTPIn-Memory OLTP:

  • 非ブロッキング。Non-blocking. ガベージ コレクションは、ワークロードへの影響を最小限に抑えながら、時間的に分散されます。Garbage collection is distributed over time with minimal impact on the workload.

  • 協調。Cooperative. ユーザー トランザクションは、garbage-collection のメイン スレッドと共にガベージ コレクションに参加します。User transactions participate in garbage collection with main garbage-collection thread.

  • 効率的。Efficient. ユーザー トランザクションにより、使用されているアクセス パス (インデックス) の古い行とのリンクが解除されます。User transactions delink stale rows in the access path (the index) being used. これにより、行が最終的に削除されるときに必要な作業が少なくなります。This reduces the work required when the row is finally removed.

  • 応答性。Responsive. メモリが不足すると積極的にガベージ コレクションが実行されます。Memory pressure leads to aggressive garbage collection.

  • スケーラブル。Scalable. コミット後、ユーザー トランザクションによりガベージ コレクションの作業の一部が実行されます。After commit, user transactions do part of the work of garbage collection. トランザクション アクティビティが多くなるほど、古い行とのリンクを解除するトランザクションが多くなります。The more transaction activity, the more the transactions delink stale rows.

ガベージ コレクションは、ガベージ コレクションのメイン スレッドによって制御されます。Garbage collection is controlled by the main garbage collection thread. ガベージ コレクションのメイン スレッドは、1 分ごとに、またはコミット済みトランザクションの数が内部しきい値を超えたときに実行されます。The main garbage collection thread runs every minute, or when the number of committed transactions exceeds an internal threshold. ガベージ コレクターのタスクを次に示します。The task of the garbage collector is to:

  • 最も古いアクティブなトランザクションより前に、行セットを削除または更新し、コミットしたトランザクションを特定します。Identify transactions that have deleted or updated a set of rows and have committed before the oldest active transaction.

  • これらの古いトランザクションによって作成された行バージョンを特定します。Identity row versions created by these old transactions.

  • 古い行を 16 行ごとの 1 つ以上の単位にグループ化します。Group old rows into one or more units of 16 rows each. その目的は、ガベージ コレクターの作業を小さな単位に分散することです。This is done to distribute the work of the garbage collector into smaller units.

  • 各スケジューラに 1 つずつ、これらの作業単位をガベージ コレクション キューに移動します。Move these work units into the garbage collection queue, one for each scheduler. これらのガベージ コレクター 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)」を参照してください。Refer to the garbage collector DMVs for the details: sys.dm_xtp_gc_stats (Transact-SQL), sys.dm_db_xtp_gc_cycle_stats (Transact-SQL), and sys.dm_xtp_gc_queue_stats (Transact-SQL).

ユーザー トランザクションは、コミット後に、そのトランザクションが実行されているスケジューラに関連付けられたすべてのキュー項目を特定し、メモリを解放します。After a user transaction commits, it identifies all queued items associated with the scheduler it ran on and then releases the memory. スケジューラのガベージ コレクションのキューが空の場合は、現在の NUMA ノードの空でないキューを検索します。If the garbage collection queue on the scheduler is empty, it searches for any non-empty queue in the current NUMA node. トランザクション アクティビティが低レベルで、メモリに負荷がかかっている場合、ガベージ コレクターのメイン スレッドは、任意のキューからガベージ コレクト行にアクセスできます。If there is low transactional activity and there is memory pressure, the main garbage-collection thread can access garbage collect rows from any queue. (たとえば) 大量の行を削除したため、トランザクション アクティビティがなく、メモリにも負荷がかかっていない場合は、トランザクション アクティビティが再開されるか、メモリに負荷がかかってくるまで、削除された行のガベージ コレクションは実行されません。If there is no transactional activity after (for example) deleting a large number of rows and there is no memory pressure, the deleted rows will not be garbage collected until the transactional activity resumes or there is memory pressure.

参照See Also

インメモリ OLTP のメモリ管理Managing Memory for In-Memory OLTP