Considere criar uma nova tabela com o mesmo esquema mais a coluna rowversion e adicione uma visualização no topo das duas tabelas que faz a união de todas. Peça às pessoas que usem a visualização e escrevam, em vez de gatilhos, nas tabelas e visualizações subjacentes.
As inserções devem ser enviadas para a nova tabela, as atualizações devem mover os dados para a nova tabela e as exclusões devem ser aplicadas a ambas as tabelas.
Em seguida, faça movimentos em lote em segundo plano, movendo o maior número possível de registros por vez para a nova tabela. Você ainda pode ter problemas de simultaneidade enquanto isso ocorre e alguns planos de execução impressionantes, mas permite que você fique on-line enquanto as mudanças estão acontecendo.
Idealmente, você inicia o processo na sexta-feira à tarde para minimizar o efeito nos usuários finais e tenta fazê-lo antes da segunda-feira de manhã. Uma vez instalado, você pode alterar a exibição para apontar apenas para a nova tabela, e os planos de execução mais importantes desaparecem. Idealmente.
Para evitar que os gatilhos sejam disparados quando os dados estão sendo migrados em lotes, observe o número de linhas nas tabelas excluídas / inseridas no gatilho e pule as atividades se elas estiverem próximas ao número de linhas no seu lote.
No final, Michael decidiu pular a exibição (e não excluir da tabela original) para obter planos mais estáveis. A troca estava segurando essencialmente duas cópias da mesa. Ele transformou em uma série de postagens no blog .
Se
TIMESTAMP
você está adicionando éNULLABLE
:VARBINARY(8)
colunaDepois de preenchida, nas instruções SQL de volta para trás,
DROP
aVARBINARY(8)
coluna que você acabou de adicionar e preencher e adicione aTIMESTAMP NULL
coluna.Se
TIMESTAMP
você está adicionando éNOT NULLABLE
:BINARY(8)
colunaDepois de preenchida, nas instruções SQL de back-to-back,
DROP
aBINARY(8)
coluna que você acabou de adicionar e preencheu eADD THE TIMESTAMP NOT NULL
column.fonte