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.


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


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.


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.


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).


-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);


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
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.