Nenhum DBMS que conheço possui qualquer "otimização" que faça VARCHAR
com que um 2^n
comprimento tenha um desempenho melhor do que um com um max
comprimento que não seja uma potência 2.
Acho que as primeiras versões do SQL Server tratavam um VARCHAR
comprimento 255 diferente daquele que possuía um comprimento máximo maior. Não sei se ainda é esse o caso.
Para quase todos os DBMS, o armazenamento real necessário é determinado apenas pelo número de caracteres que você coloca nele, não pelo max
comprimento definido. Portanto, do ponto de vista do armazenamento (e provavelmente também do desempenho), não faz diferença se você declara uma coluna como VARCHAR(100)
ou VARCHAR(500)
.
Você deve ver o max
comprimento fornecido para uma VARCHAR
coluna como um tipo de restrição (ou regra de negócios) em vez de algo técnico / físico.
Para o PostgreSQL, a melhor configuração é usar text
sem restrição de comprimento e CHECK CONSTRAINT
que limite o número de caracteres para o que sua empresa exigir.
Se esse requisito mudar, alterar a restrição de verificação é muito mais rápido do que alterar a tabela (porque a tabela não precisa ser reescrita)
O mesmo pode ser aplicado para Oracle e outros - no Oracle, em VARCHAR(4000)
vez disso text
.
Não sei se há uma diferença de armazenamento físico entre VARCHAR(max)
e, por exemplo, VARCHAR(500)
no SQL Server. Mas, aparentemente, há um impacto no desempenho ao usar varchar(max)
em comparação com varchar(8000)
.
Veja este link (postado por Erwin Brandstetter como um comentário)
Edit 22-09-2013
Em relação ao comentário de bigown:
Em Postgres versões antes 9.2 (que não estava disponível quando eu escrevi a resposta inicial) uma alteração na definição de coluna fez reescrever toda a tabela, ver, por exemplo aqui . Desde 9.2, esse não é mais o caso, e um teste rápido confirmou que o aumento do tamanho da coluna de uma tabela com 1,2 milhão de linhas levou apenas 0,5 segundos.
Para a Oracle, isso também parece verdadeiro, a julgar pelo tempo necessário para alterar a varchar
coluna de uma grande tabela . Mas não encontrei nenhuma referência para isso.
Para o MySQL, o manual diz " Na maioria dos casos, ALTER TABLE
faz uma cópia temporária da tabela original ". E meus próprios testes confirmam que: executar um ALTER TABLE
em uma tabela com 1,2 milhão de linhas (o mesmo que no meu teste com o Postgres) para aumentar o tamanho de uma coluna levou 1,5 minutos. No MySQL, no entanto, você não pode usar a "solução alternativa" para usar uma restrição de verificação para limitar o número de caracteres em uma coluna.
Para o SQL Server, não consegui encontrar uma declaração clara sobre isso, mas o tempo de execução para aumentar o tamanho de uma varchar
coluna (novamente a tabela de 1,2 milhão de linhas acima) indica que nenhuma reescrita ocorre.
Editar 2017-01-24
Parece que eu estava (pelo menos parcialmente) errado sobre o SQL Server. Veja esta resposta de Aaron Bertrand que mostra que o comprimento declarado de uma nvarchar
ou varchar
colunas faz uma enorme diferença para o desempenho.