Existe uma maneira de saber quando ocorre a limpeza das tabelas de controle de alterações? Como verificar a última ocorrência de um processo de limpeza?
FUNDO:
Eu tenho o Change Tracking no banco de dados com retenção definida para 1 minuto:
ALTER DATABASE [test] SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 1 MINUTES)
Eu faço algumas atualizações em minha tabela de teste e espero um pouco mais do que o período de retenção (digamos 3 minutos). Como o processo de limpeza é assíncrono, entendo que NÃO há garantia de que as tabelas de controle de alterações serão limpas após 1 minuto. Pode acontecer a qualquer momento > 1 min.
Encontrei este procedimento para chamar o processo de limpeza manualmente:
EXEC sp_flush_commit_table_on_demand 100000
Mas não funciona como esperado. (As linhas de rastreamento de alterações ainda estão no local após o período de retenção)
Eu reproduzi isso usando o código abaixo e, essencialmente, sim, se você esperar o tempo suficiente e a limpeza automática estiver ativada, ela será limpa sozinha. Parece estar limitado ao mínimo - ou seja, a configuração change_retention é mais uma sugestão do que um comando.
Reconheço que não testei com atividade de tabela do mundo real, etc., mas os links abaixo contêm mais informações sobre o que o trabalho faz - é mais uma caixa preta, na verdade, do que qualquer coisa.
Links:
Rastreamento de alterações do MS
Kendra Little em Rastreamento de Mudanças
Letra da música - Cortesia da Disney
Aqui está o que eu vim com.
sp_flush_commit_table_on_demand
limpa apenas assyscommittab
tabelas secundárias de controle de alterações, e não as tabelas secundárias.A execução
sp_flush_commit_table_on_demand
não tem nada a ver com a limpeza das tabelas secundárias de controle de alterações.CHANGETABLE
A função depende de ambossyscommittab
e muda as tabelas laterais de rastreamento.select * from changetable(changes dbo.t, NULL) as ct
- Isso retornará todas as alterações àdbo.t
tabela desde a primeira versão desde que passamosNULL
como a última versão sincronizada.