Bem, eu posso não entender, mas tento responder.
Você disse que precisa de uma solução de alto desempenho que seja executada com frequência (mínimo todos os 2 minutos) e que precisa de uma boa abordagem, que deve ser rápida sem travar. Mas você não quer um sistema de caixa preta.
Em vez de um sistema de caixa preta, usado em milhões de instalações com bons resultados, você tenta inventar a roda novamente e criar sua própria solução? Hum, parece um pouco estranho.
De fato, essas são minhas sugestões.
- Replicação, mesmo que você tenha dito que não a usará. É a solução mais fácil e melhor que você pode usar para isso. A replicação é fácil de configurar, replicar rapidamente e você não precisa inventar a roda novamente. Se você apenas esquisita quanto ao bloqueio, pode tentar definir
ISOLATION LEVEL
como READ_COMMITTED_SNAPSHOT
. Você pode ler mais sobre isso aqui . Isso consumirá parte do seu tempdb, mas sua tabela é sempre de leitura e gravação e a replicação pode funcionar em segundo plano.
Veja o exemplo abaixo:
ALTER DATABASE yourDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE yourDatabase SET READ_COMMITTED_SNAPSHOT ON
- O CDC (Change Data Capture) também pode ser uma solução. Mas, dessa forma, você precisa criar quase tudo sozinho. E fiz a experiência que
CDC
pode ser uma coisa frágil em algumas circunstâncias. CDC
irá capturar todos os dados em uma tabela monitorada (você precisa especificar cada tabela monitorada manualmente). Depois, você obterá o valor antes e o valor após um INSERT
, UPDATE
ou DELETE
. CDC
reterá essas informações por um período de tempo (você pode especificá-las por conta própria). A abordagem poderia ser usar CDC
em determinadas tabelas que você precisa observar e replicar manualmente essas alterações no outro banco de dados. A propósito, também CDC
usa a Replicação do SQL Server sob o capô. ;-) Você pode ler mais sobre isso aqui .
Aviso: CDC
não estará ciente das DDL
alterações. Isso significa que, se você alterar uma tabela e adicionar uma nova coluna, CDC
ela observará a tabela, mas ignorará todas as alterações na nova coluna. De fato, ele registra apenas NULL
como valor antes e depois. Você precisa reinicializá-lo após DDL
-Alterar em uma tabela monitorada.
- A maneira como você descreveu acima é como capturar uma carga de trabalho usando o SQL Server Profiler e executá-la novamente em outro banco de dados para obter alguns benchmarks. Bem, isso poderia funcionar. Mas o fato de haver muitos efeitos colaterais é um pouco pesado demais para mim. O que você faz se capturar uma chamada de procedimento no seu cliente. Depois de executar o mesmo comando no seu banco de dados principal, pois está fora de sincronia? O procedimento pode ser executado, mas pode excluir / atualizar / inserir linhas que não estavam presentes no seu cliente. Ou como você lida com vários clientes com um princípio. Eu acho que isso é muito complicado. Na pior das hipóteses, você provavelmente destrói sua integridade.
- Outra idéia poderia ser baseada em aplicativos ou usando um gatilho. Dependendo de quantas tabelas você deseja sincronizar. Você pode gravar todas as alterações em uma tabela intermediária separada e executar uma tarefa do SQL Server Agent todos os x minutos para sincronizar essas linhas na tabela intermediária com seu mestre. Mas isso pode ser um pouco pesado se você tentar sincronizar (por exemplo) 150 tabelas. Você teria uma grande sobrecarga.
Bem, estes são os meus 2 centavos. Espero que você tenha uma boa visão geral e talvez tenha encontrado uma solução que funcione para você.