Devido a uma de nossas tabelas crescer fora do intervalo de um INT, algo que não foi previsto quando o DB foi produzido, precisamos alterar o campo PK para um BIGINT.
No entanto, estamos enfrentando problemas com relação ao uso de espaço do tempdb logo na primeira etapa ao manipular essa tabela: tentar descartar a restrição de chave primária nela para que possamos alterá-la. Nenhum de nossos ambientes de teste tem mais espaço do que 50 GB reservados para tempdb, enquanto a tabela ocupa cerca de 120 GB de espaço no momento. A tabela tem apenas 5 colunas e elas contêm apenas outros INTs e alguns varchars curtos.
Algum de vocês tem alguma sugestão melhor, talvez mais leve, no que diz respeito ao tempdb e ao arquivo de log, para fazer as mesmas alterações? A tabela tem apenas algumas colunas, todas contendo poucos dados. Exemplo abaixo, por mais simples que seja.
ALTER TABLE OURTABLE DROP CONSTRAINT OURTABLE_PK
ALTER TABLE OURTABLE ALTER COLUMN OURTABLE_ID BIGINT NOT NULL
ALTER TABLE OURTABLE ADD CONSTRAINT OURTABLE_PK PRIMARY KEY CLUSTERED (OURTABLE_ID)
Obrigado!
Estive pensando em apenas criar uma nova tabela com as mesmas definições e um BIGINT como uma inserção em massa e, em seguida, renomeá-la enquanto descartava a antiga. Mas não tenho certeza se isso será uma solução melhor, já que as restrições teriam que ser colocadas depois de qualquer maneira.
Supondo que você tenha uma janela de manutenção que permita um curto período de inatividade, sugiro usar o BCP para despejar a tabela em um arquivo. Se o espaço for um problema, comprima a pasta de destino antes da exportação.
DROP
sua tabela antiga,CREATE
nova comBIGINT
chave e importe os dados.A estranha escolha do delimitador |¬| é uma combinação normalmente segura que evita colisões em campos de texto. Até agora de qualquer maneira.
Como você mencionou nos comentários, você pode minimizar o crescimento do log alternando para recuperação em massa. Dado que você não terá nenhuma outra atividade durante esta janela de manutenção, você pode alternar para simples, executar o processo, voltar para completo e fazer um backup completo. Observe que o uso de
BATCHSIZE
no exemplo criará uma transação separada para cada lote.