Recentemente, adicionei uma coluna de bits com capacidade NULL a uma tabela que possui quase 500 milhões de linhas. Não há um padrão na coluna, no entanto, todas as inserções estão especificando o valor 0 ou 1, e executei uma rotina única para atribuir 0 ou 1 a todas as linhas existentes (atualizando as linhas em pequenos lotes). Cada linha agora deve ter um 0 ou 1 nessa coluna.
Eu quero tornar a coluna de bits não anulável, no entanto, quando tentei fazê-lo ALTER TABLE t1 ALTER COLUMN c1 bit not null
, ela começou a funcionar por 3 minutos e eu a parei porque estava bloqueando todas as leituras da tabela e eu suspeitava que demoraria muito tempo para concluir . É possível que não demore muito, mas não pude arriscar muita indisponibilidade. A reversão em si levou 6 minutos.
Você tem alguma sugestão de como eu posso tornar a coluna não anulável sem levar horas para ser concluída? Além disso, existe alguma maneira de estimar quanto tempo a ALTER TABLE ALTER COLUMN
declaração que eu iniciei e cancelei levaria para ser concluída?
Estou usando o SQL Server 2017 Web Edition.
fonte
SELECT c1, count(*) FROM t1 GROUP BY c1
que levou cerca de 9 minutos para ser executado. AALTER TABLE ALTER COLUMN
declaração real depois disso levou 25 minutos para ser concluída. Não é tão ruim.Se você estiver no Enterprise Edition (EE), uma estratégia melhor pode ter sido adicioná-lo como
NOT NULL
padrão0
ou1
(o que for mais comum).Essa é uma alteração somente de metadados no EE . Atualize os que precisam ser invertidos. Isso significa menos atualizações e não é necessário alterar a nulidade da coluna quando terminar. - Martin Smith
fonte
Tente copiar os dados para uma nova tabela e renomeie-os. Você precisa cuidar de quaisquer restrições e índices. É isso que o designer de tabelas SSMS está fazendo quando você deseja reordenar as colunas (por exemplo), mas você deve verificar o script para ver se há algo que não parece certo.
Durante a cópia, o acesso de leitura à tabela de origem não é um problema, mas se houver gravações, elas poderão ser bloqueadas ou não copiadas, dependendo do nível de isolamento.
fonte