Devo sempre usar (n)varchar(max)
para colunas de texto?
Não.
Para o SQL Server, os max
tipos de dados devem ser especificados apenas quando não houver alternativa. Em vez disso, deve-se escolher o tipo de base correto ( varchar
ou nvarchar
) e especificar um comprimento máximo explícito adequado aos dados a serem armazenados.
O armazenamento físico é idêntico, independentemente de a coluna ser digitada como varchar(n)
ou varchar(max)
, portanto, essa não é a preocupação.
Os motivos para não escolher em (n)varchar(max)
qualquer lugar giram em torno de recursos, qualidade do plano e desempenho.
Uma lista exaustiva provavelmente não é prática, mas, entre outras coisas, max
colunas:
Recursos
- Exigir uma restrição separada para impor um comprimento máximo
- Não pode ser uma chave em um índice (portanto, também não há restrições exclusivas)
- Pode impedir DDL online (incluindo recriações de índice e adição de uma nova coluna não nula)
- Geralmente não são suportados para recursos 'mais recentes', por exemplo, columnstore
- Consulte a documentação do produto para obter recursos e limitações mais específicos. O padrão geral é que existem limitações e restrições embaraçosas em torno
max
dos tipos de dados. Nem todas as limitações e efeitos colaterais estão documentados.
atuação
- Exigir tratamento especial no mecanismo de execução, para considerar o tamanho potencialmente muito grande. Normalmente, isso envolve o uso de um caminho de código menos eficiente, com uma interface de streaming
- Pode ter conseqüências imprevistas semelhantes para código externo (e outros componentes do SQL Server como SSIS), que também devem estar preparados para manipular dados de tamanho de até 2 GB
- Supõe-se ter 4000 bytes de largura nos cálculos de concessão de memória. É provável que isso leve a reserva de memória excessiva, o que limita a simultaneidade e empurra valiosas páginas de índice e dados da memória cache
- Desative várias otimizações de desempenho importantes
- Pode prolongar a duração do bloqueio
- Pode impedir que o otimizador escolha um plano de busca (não dinâmico)
- Impedir a inserção de filtros nas varreduras e buscar como um resíduo
- Pode aumentar a pressão e a contenção do tempdb (dependente da versão), pois também é provável que variáveis e parâmetros sejam digitados
max
para corresponder às definições da coluna
Em resumo, existem tantos efeitos colaterais sutis (e indesejáveis) do uso desnecessário do max
especificador que não faz sentido fazer isso. A menor 'conveniência' de usar uma única declaração não é um tipo de compensação.
Avalie cada tipo no contexto, use o tipo de base correto ( varchar
ou nvarchar
) e um comprimento explícito sensível.
Leitura adicional:
Paul White diz que a GoFundMonica
fonte
varchar(not-max)
parâmetros, então eu meio que enfiei um pé na minha boca aqui. Mas sim, a injeção de SQL seria aplicável aqui. Talvez eu deva reformular esta resposta um pouco.