Partilhar via


In-Memory Recolha de Lixo OLTP

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azure

Uma linha de dados é considerada obsoleta se foi eliminada por uma transação que já não está ativa. Uma fila obsoleta é elegível para recolha de lixo. As seguintes são as características da recolha de lixo em In-Memory OLTP:

  • Não bloqueante. A recolha de lixo é distribuída ao longo do tempo com impacto mínimo na carga de trabalho.

  • Cooperativo. As transações dos utilizadores participam na recolha de lixo juntamente com a linha de execução principal de recolha de lixo.

  • Eficiente. As transações do utilizador desligam linhas obsoletas no caminho de acesso (o índice) que está a ser utilizado. Isto reduz o trabalho necessário quando a linha é finalmente removida.

  • Adaptável. A pressão de memória leva a uma recolha agressiva de lixo.

  • Escalável. Após o commit, as transações do utilizador fazem parte do trabalho de recolha de lixo. Quanto maior a atividade das transações, mais as transações desligam as linhas obsoletas.

A recolha de lixo é controlada pelo thread principal de recolha de lixo. A thread principal de recolha de lixo é executada a cada minuto, ou quando o número de transações comprometidas ultrapassa um limiar interno. A tarefa do coletor de lixo é:

  • Identifique transações que tenham apagado ou atualizado um conjunto de linhas e que tenham sido confirmadas antes da transação ativa mais antiga.

  • Versões da linha de identidade criadas por estas transações antigas.

  • Agrupe as linhas antigas em uma ou mais unidades de 16 filas cada. Isto é feito para distribuir o trabalho do coletor de lixo em unidades mais pequenas.

  • Move estas unidades de trabalho para a fila de recolha de lixo, uma para cada schedulador. Consulte os DMVs do coletor de lixo para mais 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 o commit de uma transação do usuário, identifica todos os itens em fila associados ao agendador em que foi executado e depois liberta a memória. Se a fila de recolha de lixo no escalonador estiver vazia, procura qualquer fila não vazia no nó NUMA atual. Se houver baixa atividade transacional e pressão de memória, a thread principal de recolha de lixo pode aceder às linhas de recolha de lixo a partir de qualquer fila. Se não houver atividade transacional após (por exemplo) eliminar um grande número de linhas e não houver pressão de memória, as linhas eliminadas não serão recolhidas de lixo até que a atividade transacional retome ou haja pressão de memória.

Ver também

Gestão da Memória para In-Memory OLTP