Nenhum DBMS que conheço possui qualquer "otimização" que faça VARCHARcom que um 2^ncomprimento tenha um desempenho melhor do que um com um maxcomprimento que não seja uma potência 2.
Acho que as primeiras versões do SQL Server tratavam um VARCHARcomprimento 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 maxcomprimento 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 maxcomprimento fornecido para uma VARCHARcoluna 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 textsem restrição de comprimento e CHECK CONSTRAINTque 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 varcharcoluna de uma grande tabela . Mas não encontrei nenhuma referência para isso.
Para o MySQL, o manual diz " Na maioria dos casos, ALTER TABLEfaz uma cópia temporária da tabela original ". E meus próprios testes confirmam que: executar um ALTER TABLEem 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 varcharcoluna (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 nvarcharou varcharcolunas faz uma enorme diferença para o desempenho.