Não tenho uma resposta "melhor", mas tenho uma resposta "menos ruim" que pode permitir que você faça as coisas razoavelmente rápido.
Minha tabela tinha linhas de 2MM e o desempenho da atualização foi ruim quando tentei adicionar uma coluna de registro de data e hora secundária que padronizou a primeira.
ALTER TABLE mytable ADD new_timestamp TIMESTAMP ;
UPDATE mytable SET new_timestamp = old_timestamp ;
ALTER TABLE mytable ALTER new_timestamp SET NOT NULL ;
Depois de 40 minutos de espera, tentei fazer isso em um pequeno lote para ter uma idéia de quanto tempo isso levaria - a previsão era de 8 horas.
A resposta aceita é definitivamente melhor - mas esta tabela é muito usada no meu banco de dados. Existem algumas dezenas de mesas que FKEY nele; Eu queria evitar trocar CHAVES ESTRANGEIRAS em tantas tabelas. E depois há pontos de vista.
Um pouco de pesquisa de documentos, estudos de caso e StackOverflow, e eu tive o "A-Ha!" momento. O dreno não estava no UPDATE principal, mas em todas as operações do INDEX. Minha tabela tinha 12 índices - alguns para restrições exclusivas, outros para acelerar o planejador de consultas e alguns para pesquisa de texto completo.
Cada linha que foi ATUALIZADA não estava apenas trabalhando em um DELETE / INSERT, mas também na sobrecarga de alterar cada índice e verificar restrições.
Minha solução foi eliminar todos os índices e restrições, atualizar a tabela e adicionar todos os índices / restrições novamente.
Demorou cerca de 3 minutos para escrever uma transação SQL que fez o seguinte:
- INÍCIO;
- caiu índices / constaints
- tabela de atualização
- adicionar novamente índices / restrições
- COMMIT;
O script levou 7 minutos para ser executado.
A resposta aceita é definitivamente melhor e mais adequada ... e praticamente elimina a necessidade de tempo de inatividade. No entanto, no meu caso, seria necessário muito mais trabalho de "Desenvolvedor" para usar essa solução e tínhamos uma janela de 30 minutos de tempo de inatividade programada em que ela poderia ser realizada. Nossa solução abordou isso em 10.
ALTER TABLE .. ADD COLUMN ...
parte ou deve ser respondida também?