Como varchar
de qualquer maneira aloca espaço dinamicamente, minha pergunta é se o uso varchar(255)
é mais eficiente ou economiza mais espaço em comparação ao uso do varchar(5000)
. Se sim, por quê?
relate perguntas
-
SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado
-
Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?
-
Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?
-
Quais são as principais causas de deadlocks e podem ser evitadas?
-
Como determinar se um Índice é necessário ou necessário
Sim,
varchar(5000)
pode ser pior do quevarchar(255)
se todos os valores couberem neste último. O motivo é que o SQL Server estimará o tamanho dos dados e, por sua vez, as concessões de memória com base no tamanho declarado (não real ) das colunas em uma tabela. Quando você tivervarchar(5000)
, ele assumirá que cada valor tem 2.500 caracteres e reservará memória com base nisso.Aqui está uma demonstração da minha recente apresentação GroupBy sobre maus hábitos que facilita a comprovação por si mesmo (requer SQL Server 2016 para algumas das
sys.dm_exec_query_stats
colunas de saída, mas ainda deve ser comprovado comSET STATISTICS TIME ON
outras ferramentas em versões anteriores); ele mostra memória maior e tempos de execução mais longos para a mesma consulta nos mesmos dados - a única diferença é o tamanho declarado das colunas:Então, sim, dimensione corretamente suas colunas , por favor.
Além disso, executei novamente os testes com varchar(32), varchar(255), varchar(5000), varchar(8000) e varchar(max). Resultados semelhantes ( clique para ampliar ), embora as diferenças entre 32 e 255, e entre 5.000 e 8.000, foram insignificantes:
Aqui está outro teste com a
TOP (5000)
mudança para o teste mais totalmente reproduzível sobre o qual eu estava sendo incessantemente atormentado ( clique para ampliar ):Portanto, mesmo com 5.000 linhas em vez de 10.000 linhas (e há mais de 5.000 linhas em sys.all_columns pelo menos desde o SQL Server 2008 R2), uma progressão relativamente linear é observada - mesmo com os mesmos dados, maior o tamanho definido da coluna, mais memória e tempo são necessários para satisfazer exatamente a mesma consulta (mesmo que ela tenha um
DISTINCT
).