Eu tenho uma tabela com uma coluna de identidade que também é uma chave primária. Atualmente, possui 50 milhões de linhas, com o valor mais alto da coluna de identidade em 148.921.803. A mesa tem muitos DELETE
se INSERTS
realizados nela, daí o alto valor.
Queremos alterar o tipo de dados de INT
para BIGINT
para preparar a adição de mais linhas. Observe que não há referências à coluna PK.
Qual é a melhor maneira de fazer isso, com o mínimo de tempo de inatividade? Eu tenho duas opções.
- Solte o PK e altere a coluna; ou
- O método copy-drop-rename, conforme descrito aqui :
Como há uma chave primária definida na coluna de identidade, você não poderá alterar diretamente esta coluna.
Ambas as abordagens que você mencionou em sua pergunta podem ser usadas e o tempo de inatividade depende do desempenho do servidor e do número de linhas que residem nessa tabela.
Primeiro solte o PK
Alterar coluna
Adicionar chave primária
Essa abordagem geralmente não leva muito tempo. No meu ambiente, leva alguns segundos em grandes tabelas com mais de 5 milhões de linhas.
Você também pode usar essa abordagem. No entanto, para essa abordagem, você precisa de mais tempo de inatividade do que o Approach, pois precisa sincronizar as tabelas.
Aaron Bertrand tem uma série de 4 partes sobre este tópico, começando com:
Minimizando o impacto do alargamento de uma coluna IDENTITY – parte 1
Se você realmente precisa mudar para o
bigint
, deve minimizar o tempo de inatividade e tem bastante tempo para planejar, a abordagem que ele documenta na parte 4 é:Mais detalhadamente, Aaron diz: