Partilhar via


Coleta de lixo de OLTP in-memory

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Uma linha de dados é considerada obsoleta se foi excluída por uma transação que não está mais ativa. Uma linha obsoleta é qualificada para a coleta de lixo. Veja a seguir as características da coleta de lixo no OLTP in-memory:

  • Sem bloqueio. A coleta de lixo é distribuída com o tempo com um impacto mínimo sobre a carga de trabalho.

  • Cooperativa. As transações de usuário participam da coleta de lixo com o thread principal de coleta de lixo.

  • Eficiente. Transações de usuário desvinculam linhas obsoletas no caminho de acesso (o índice) em uso. Isso reduz o trabalho necessário quando a linha é finalmente removida.

  • Respondendo. A pressão da memória leva à coleta de lixo agressiva.

  • Escalonável. Após a confirmação, transações de usuário fazem parte do trabalho de coleta de lixo. Quanto maior for a atividade transacional, mais transações existirão para desvincular linhas obsoletas.

A coleta de lixo é controlada pelo thread principal de coleta de lixo. O thread principal de coleta de lixo é executado a cada minuto, ou quando o número de transações confirmadas excede um limite interno. A tarefa do coletor de lixo é:

  • Identificar as transações que excluíram ou atualizaram um conjunto de linhas e que foram confirmadas antes da transação ativa mais antiga.

  • Identificar versões de linha criadas por essas transações antigas.

  • Agrupar as linhas antigas em uma ou mais unidades de 16 linhas cada. Isso é feito para distribuir o trabalho do coletor de lixo em unidades menores.

  • Mover essas unidades de trabalho para a fila de coleta de lixo, uma para cada agendador. Veja os DMVs do coletor de lixo para obter os detalhes: sys.dm_xtp_gc_stats (Transact-SQL), sys.dm_db_xtp_gc_cycle_stats (Transact-SQL) e sys.dm_xtp_gc_queue_stats (Transact-SQL).

Após a confirmação de uma transação de usuário, ele identifica todos os itens enfileirados associados ao agendador que ele executou e libera a memória. Se a fila de coleta de lixo no agendador estiver vazia, ele procurará uma fila não vazia no nó NUMA atual. Se houver baixa atividade transacional e pressão de memória, o thread principal da coleta de lixo poderá acessar linhas da coleta de lixo de qualquer fila. Se não houver atividade transacional (por exemplo) após a exclusão de um grande número de linhas e não houver pressão de memória, as linhas excluídas não passarão por coleta de lixo até a atividade transacional ser retomada ou haver pressão de memória.

Confira também

Gerenciando memória para OLTP in-memory