A resposta específica à sua pergunta (pelo menos para Oracle e provavelmente para outros bancos de dados) é que o tamanho do campo não importa, apenas o tamanho dos dados. No entanto, isso não deve ser usado como um fator determinante para definir ou não o campo para o comprimento máximo permitido. Aqui estão alguns outros problemas que você deve considerar antes de maximizar o tamanho dos campos.
Formatação
Qualquer ferramenta cliente que formate os dados com base no tamanho dos campos exigirá considerações especiais de formatação. O SQL * Plus do Oracle, por exemplo, exibe o tamanho máximo das colunas Varchar2, mesmo que os dados tenham apenas um caractere. Comparar…
create table f1 (a varchar2(4000), b varchar2(4000));
create table f2 (a varchar2(5), b varchar2(5));
insert into f1 values ('a','b');
insert into f2 values ('a','b');
select * from f1;
select * from f2;
Tamanho
incorreto do campo de dados fornece um mecanismo adicional para capturar / impedir dados incorretos. Uma interface não deve tentar inserir 3000 caracteres em um campo de 100 caracteres, mas se esse campo estiver definido como 4000 caracteres, é possível que sim. O erro não foi detectado no estágio de entrada de dados, mas o sistema pode ter problemas ainda mais quando outro aplicativo tenta processar os dados e engasga. Como exemplo, se você decidir indexar posteriormente o campo no Oracle, excederá o comprimento máximo da chave (dependendo do tamanho e da concatenação do bloco). Vejo…
create index i1 on f1(a);
Memória
Se o aplicativo cliente alocar memória usando o tamanho máximo, o aplicativo alocaria significativamente mais memória do que o necessário. Considerações especiais teriam que ser feitas para evitar isso.
Documentação
O tamanho do campo fornece outro ponto de dados da documentação sobre os dados. Poderíamos chamar todas as tabelas t1, t2, t3 etc. e todos os campos f1, f2, f3 etc., mas especificando nomes significativos, melhor entendemos os dados. Por exemplo, se uma tabela de endereços de uma empresa com clientes nos EUA tiver um campo chamado State com dois caracteres, esperamos que a abreviação de dois caracteres entre nela. Por outro lado, se o campo tiver cem caracteres, podemos esperar que o nome completo do estado seja inserido no campo.
Tudo isso dito, parece prudente estar preparado para a mudança. Só porque todos os nomes de seus produtos hoje cabem em 20 caracteres não significa que eles sempre serão. Não exagere e faça 1000, mas deixe espaço para uma expansão plausível.
Aqui está um bom ponto de partida para você.
http://www.sqlskills.com/BLOGS/KIMBERLY/post/Disk-space-is-cheap.aspx
Eu posso ter entendido mal sua pergunta original. Deixe-me ver se consigo encontrar alguns outros links para referência.
Aqui está uma boa referência sobre as seleções de tipo de dados: http://sqlfool.com/2009/05/performance-considerations-of-data-types/
Mudar de varchar (20) para varchar (30) pode parecer algo pequeno, mas você precisa entender mais sobre como as estruturas de banco de dados funcionam para estar ciente dos possíveis problemas. Por exemplo, acessar varchar (30) pode levar o ponto de inflexão de suas colunas (caso todos os 30 bytes sejam usados), podendo ser armazenado em uma página (menos de 8060 bytes). Isso levará a um aumento no espaço em disco usado, uma diminuição no desempenho e até alguma sobrecarga adicional nos logs de transações.
Aqui está um link para estruturas de banco de dados: http://technet.microsoft.com/en-us/sqlserver/gg313756.aspx
Aqui está um para divisões de página e log de trx: http://sqlskills.com/BLOGS/PAUL/post/How-expensive-are-page-splits-in-terms-of-transaction-log.aspx
HTH
fonte
Pensei em compartilhar outro ponto interessante, encontrado na seguinte pergunta do SO:
/programming/148398/are-there-any-disadvantages-to-always-using-nvarcharmax
Resposta original de: Nick Kavadias
Eu consideraria isso uma grande desvantagem ao adicionar colunas n / varchar (max) arbitrariamente e, de acordo com o site da MS, essa restrição contra a reconstrução de índices online permanece no SQL Server 2008, 2008 R2 e Denali; portanto, não é específico para o SQL Server 2005.
Obrigado Jeff
fonte
Em alguns casos, a quantidade de espaço que você aloca para um campo varchar afetará a quantidade de memória alocada para classificações na memória.
Eu achei as apresentações no SQLWorkshops.com instigantes. Esta apresentação fala sobre um caso em que uma classificação de um pedido está sendo transmitida para tempdb porque não há memória suficiente sendo alocada para os campos char / varchar.
http://webcasts2.sqlworkshops.com/webcasts.asp
Este webcast também foi apresentado como um artigo no seguinte site:
http://www.mssqltips.com/tip.asp?tip=1955
Observe nesta apresentação que a coluna que está sendo classificada não é a coluna char / varchar, mas a quantidade de espaço alocado para a coluna varchar na memória faz diferença no desempenho da consulta em alguns casos.
fonte
SET ANSI_PADDING ON?
Você acaba com muito espaço em branco à direita ...
fonte
É importante apenas relacionado ao espaço em disco e comprimento dos caracteres. Obviamente, a pesquisa em tipos de dados de caracteres e índices nesse tipo de dados atuará mais lentamente que o número inteiro, mas essa é outra discussão.
O tipo de dados Varchar é um tipo de dados "variável", portanto, se você configurar um limite de varchar (500), esse será o comprimento máximo de caracteres para esse campo. O comprimento mínimo pode estar entre 0 e 500. Por outro lado, o espaço em disco reivindicado será diferente para campos de 10, 30 ou 500 caracteres.
Às vezes, eu fazia um teste para o tipo de dados varchar (800) e para valores nulos eu tinha 17 bytes usados e, para cada caractere inserido, adicionava mais um byte. Por exemplo, uma sequência de 400 caracteres tinha 417 bytes usados no disco.
fonte
Não acho que exista diferença entre tabelas criadas com colunas de varchar (20) ou varchar ((8000), desde que o comprimento máximo real seja <= 20.
Por outro lado, em alguns casos, oferecer aos usuários a possibilidade de armazenar seqüências mais longas pode incentivá-los a fazê-lo.
fonte