No SQL Server 2014, na memória OLTP, o que acontece se uma transação for revertida e a versão recém-criada da linha não for mais necessária. É dever do coletor de lixo remover até mesmo esse tipo de linha ou esse lixo será coletado em tempo de execução na reversão da transação?
relate perguntas
-
SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado
-
Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?
-
Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?
-
Quais são as principais causas de deadlocks e podem ser evitadas?
-
Como determinar se um Índice é necessário ou necessário
Meu entendimento do artigo SIGMOD Hekaton: SQL Server's Memory-Optimized OLTP Engine é que ele é tratado da mesma forma que outros tipos de lixo.
Algumas seções relevantes são
Observe que diz invalidado , não coletado como lixo.
Veja também a seção Coleta de Lixo (grifo meu)
Mas, na prática, parece que o lixo das reversões é dispensado mais rapidamente do que dos commits, então talvez o encadeamento abortado limpe seu próprio lixo pelo menos algumas vezes.
Para ver isso, criei o seguinte proc (em um banco de dados com otimização de memória)
E, em seguida, executei o seguinte, experimentando alternar os
ROLLBACK
eCOMMIT
Eu consistentemente obtive resultados resumidos da seguinte forma.
O efeito do
UPDATE
foi o mesmo para transações confirmadas e revertidasmemory_allocated_for_table_kb
(aumentou de 7 KB para 15 KB)Estatísticas do intervalo
As estatísticas iniciais do intervalo para ambos os testes foram as mesmas com
No meio da transação (antes da reversão ou confirmação), as contagens de balde são
Em seguida
rollback
, eles revertem instantaneamente para a contagem inicial, mas depoiscommit
permanecem como na segunda tabela, mostrando que o lixo agora está presente.O único balde que aparentemente todos os valores de PK fazem hash agora tem 16 linhas vinculadas em vez das 8 anteriores.
E agora o índice de hash na outra coluna tem dois baldes em uso com 8 linhas vinculadas em cada (para os valores de string "antes" e "depois" de
AAA...
eBBB...
)Linhas expiradas
Depois de Confirmar
Após a reversão
O
rows_expired
está8
em ambos os casos, masrows_expired_removed
está0
seguindo a confirmação da transação, enquanto todos eles foram removidos após a reversão.