Qual é a maneira mais eficiente de alterar uma definição de coluna em uma tabela com milhões de linhas

9

Eu preciso alterar uma coluna de NOT NULL para NULL em uma tabela que contém milhões de linhas. Eu tentei uma simples

alter table Table1 ALTER COLUMN Column1 XML NULL

mas leva uma eternidade. Então, aqui estão as minhas questões:

  1. Por que demora tanto tempo para aplicar a alteração?
  2. Tem algum jeito melhor de fazer isso?
Jonas Stawski
fonte

Respostas:

3

1) Seria necessário obter mais informações sobre a estrutura completa da tabela + índices não agrupados para descobrir corretamente o que está acontecendo, mas minha suspeita é algo a ver com o bitmap NULL.

Por favor, consulte para mais detalhes sobre o tópico. http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-null-bitmap-size.aspx

http://www.sqlskills.com/BLOGS/PAUL/post/A-SQL-Server-DBA-myth-a-day-(630)-three-null-bitmap-myths.aspx

2) Sim, desde que você tenha espaço de armazenamento, crie uma nova tabela com capacidade de nulidade correta e transfira os dados em vários lotes para evitar o crescimento excessivo de logs e alterne a tabela usando a técnica listada abaixo. Eu fiz isso várias vezes com pouco ou nenhum tempo de inatividade.

http://jahaines.blogspot.com/2009/12/sql-server-2005-how-to-move-10-millions.html

Sankar Reddy
fonte
6

Seria mais rápido:

  1. Crie uma nova tabela com a definição correta para Column1
  2. INSERT INTO <NewTable> SELECT * FROM <OriginalTable>;
  3. Renomeie OriginalTable para OriginalTable_old; Renomear NewTable para OriginalTable
  4. Validar e descartar OriginalTable_old

A vantagem aqui é que você não mantém uma trava na tabela Original durante a operação. A tabela deve ser bloqueada apenas durante a fase de renomeação. (Supõe que o SQL Server ofereça suporte a uma renomeação no nível do objeto.)

RobPaller
fonte
Sim, o SQL Server suporta renomeações no nível do objeto usando o procedimento armazenado do sistema sp_rename.
gonsalu 28/10
Consegui alterar uma coluna dessa maneira com 3,5 milhões de linhas em 1 minuto.
Mohsen Afshin
2

Cada linha precisa ser tocada ao alterar a coluna de NOT NULL para NULL, e é por isso que leva tanto tempo para ser concluída. Não há como fazê-lo levar menos tempo.

Mrdenny
fonte
1

Outra opção é criar uma nova coluna com definição correta para a tabela em questão, atualizar a coluna com dados da coluna antiga e soltar a coluna antiga.

Ou você pode consultar uma postagem mais antiga do SE que trata de um problema semelhante em uma coluna INT.

/programming/4311559/sql-server-performance-for-alter-table-alter-column-change-data-type

yrushka
fonte
No meu caso, minha coluna está simplesmente cheia de NULLs, então estou pensando que esse seria o caminho a seguir, criar uma nova coluna completamente NULL com o nome correto não deve demorar muito tempo ... e excluir a coluna antiga, em vez de lidar com milhões de inserções ...
Zack
0

Se você abrir o monitor de atividades SQL enquanto o comando estiver em execução, poderá saber se ele está realmente processando-o ou se está aguardando alguma forma de bloqueio exclusivo da tabela.

Matthew Steeples
fonte