Aumente a coluna de alteração de velocidade na tabela grande para NON NULL

12

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 COLUMNdeclaração que eu iniciei e cancelei levaria para ser concluída?

Estou usando o SQL Server 2017 Web Edition.

Ben Amada
fonte

Respostas:

12

Em vez de alterar a definição da coluna, você pode adicionar um CHECK CONSTRAINTque não permita NULLs para essa coluna. A tabela ainda precisará ser digitalizada, mas não precisará modificar todas as páginas de dados, por isso deve ser uma operação muito mais rápida. Lamentavelmente, uma trava Sch-M ainda será mantida durante a operação. Um truque é tentar colocar o máximo possível da tabela no buffer pool antes de tentar adicionar a restrição. Isso pode reduzir a quantidade de tempo que a trava Sch-M é mantida.

Você pode remover a restrição e alterar a definição da coluna durante sua próxima janela de manutenção.

Joe Obbish
fonte
Obrigado Joe pela ideia. Eu quase adicionei uma restrição de verificação, mas tinha uma janela de manutenção no fim de semana e consegui alterar a coluna para não ser anulável. Não tenho certeza se isso ajudou, mas para tentar obter os dados da tabela no buffer pool, imediatamente antes de tornar a coluna não anulável, executei o processo SELECT c1, count(*) FROM t1 GROUP BY c1que levou cerca de 9 minutos para ser executado. A ALTER TABLE ALTER COLUMNdeclaração real depois disso levou 25 minutos para ser concluída. Não é tão ruim.
Ben Amada
11

Se você estiver no Enterprise Edition (EE), uma estratégia melhor pode ter sido adicioná-lo como NOT NULLpadrão 0ou 1(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

user126897
fonte
Curiosamente, notei esse recurso na semana passada, quando testei a adição de uma coluna de bits não anuláveis ​​com um valor padrão a essa mesma tabela grande na minha máquina local que está executando o SQL developer edition - a coluna foi adicionada instantaneamente e não consegui descobrir por que . Mais tarde, ele me disse que deve ser porque a edição para desenvolvedores inclui recursos de EE.
Ben Amada
-3

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.

Razvan Socol
fonte