Ao aumentar o tamanho da coluna VARCHAR em uma tabela grande, pode haver algum problema?

87

Estou usando o SQL Server 2008 e preciso aumentar o campo VARCHAR, de (200 a 1200) em uma tabela com cerca de 500 mil linhas. O que preciso saber é se há algum problema que não considerei.

Usarei esta instrução TSQL:

ALTER TABLE MyTable
ALTER COLUMN [MyColumn] VARCHAR(1200)

Eu já experimentei em uma cópia dos dados e esta declaração não teve nenhum efeito nocivo que eu pudesse ver.

Então, há algum problema possível em fazer isso que eu não tenha considerado?

A propósito, a coluna não está indexada.

Paul T Davies
fonte
1
@nonnb: essa é uma ideia horrível. stackoverflow.com/q/2091284/27535
gbn
@gbn alguma opinião sobre a resposta recente de Justin a essa pergunta? Parece estar um pouco em desacordo com o seu.
AakashM de
@AakashM: ele está certo sobre o armazenamento, mas é uma sobrecarga, não uma otimização. Agora leia stackoverflow.com/q/2009694/27535
gbn
@gbn - bom ponto, como é a observação de Martin Smith sobre indexação. Retirado.
StuartLC,
2
Acontece que no final havia um pegadinha! O campo foi indexado, e quando alguém tentou inserir uma entrada maior que 900b falhou! Esteja avisado.
Paul T Davies

Respostas:

59

Esta é uma alteração de metadados apenas: é rápida.

Uma observação: especifique NULL ou NOT NULL explicitamente para evitar "acidentes" se uma das configurações SET ANSI_xx for diferente, por exemplo, executar em osql e não SSMS por algum motivo

gbn
fonte
1
Tudo correu bem com isso. Sem problemas.
Paul T Davies
Você sabe se as mesmas regras se aplicam ao ir de varchar(200)para varchar(max)?
CodeNaked em
@CodeNaked: é muito mais complicado de responder. (máx.) é um tipo de LOB que pode ser "em linha" ou fora da linha. No entanto, estou inclinado a dizer que deve ser o mesmo porque os dados já estão "na linha" e nenhuma reconstrução da tabela seria necessária
gbn
12

Só queria adicionar meus 2 centavos, já que pesquisei essa questão no Google porque me encontrei em uma situação semelhante ...

ESTEJA CIENTE de que mudar de varchar(xxx)para varchar(yyy)é uma mudança de metadados, mas mudar para varchar(max)não é. Porque os varchar(max)valores (também conhecidos como valores BLOB - imagem / texto etc.) são armazenados de forma diferente no disco, não dentro de uma linha da tabela, mas "fora da linha". Assim, o servidor enlouquecerá em uma grande mesa e não responderá por minutos (horas).

--no downtime
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(1200)

--huge downtime
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(max)

PS. o mesmo se aplica a nvarcharou curso.

jazzcat
fonte
4

Mudar para Varchar (1200) de Varchar (200) não deve causar nenhum problema, pois é apenas uma alteração de metadados e como o SQL server 2008 trunca espaços em branco excessivos, você também não deve ver diferenças de desempenho, portanto, em resumo, não deve haver problemas em fazer o mudança.

Kprice84
fonte
Acredito que isso possa ser verdade para tabelas pequenas, mas para tabelas grandes que estão sendo ativamente consultadas, isso pode bloquear por um período significativo de tempo (já que o servidor SQL precisa ver se precisa truncar todas as linhas).
CodeNaked em
0

Outra razão pela qual você deve evitar converter a coluna em varchar (max) é porque você não pode criar um índice em uma coluna varchar (max).

psikorski
fonte
-3

No meu caso, alter column não estava funcionando, então pode-se usar o comando 'Modify', como:

alterar tabela [nome_tabela] MODIFICAR coluna [nome_coluna] varchar (1200);

Gourav Singla
fonte
5
Isso porque você não está usando o SQL Server de acordo com a pergunta (mas MySQL, provavelmente). "ALTER TABLE ... MODIFY" não é um T-SQL válido.
Jeroen Mostert