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.

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.


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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.