메모리 내 OLTP 가비지 수집In-Memory OLTP Garbage Collection

데이터 행은 더 이상 활성화되지 않는 트랜잭션에서 삭제된 경우 유효하지 않은 것으로 간주됩니다.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. 사용자 트랜잭션이 기본 가비지 수집 스레드와 함께 가비지 수집에 참여합니다.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. 기본 가비지 수집 스레드는 매분 또는 커밋된 트랜잭션 수가 내부 임계값을 초과할 때 실행됩니다.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행으로 구성된 하나 이상의 단위로 이전 행을 그룹화합니다.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.

  • 이러한 작업 단위를 각 스케줄러의 가비지 수집 큐로 이동합니다.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