Devo sempre usar (n)varchar(max)para colunas de texto?
Não.
Para o SQL Server, os maxtipos de dados devem ser especificados apenas quando não houver alternativa. Em vez disso, deve-se escolher o tipo de base correto ( varcharou 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, maxcolunas:
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
maxdos 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
maxpara corresponder às definições da coluna
Em resumo, existem tantos efeitos colaterais sutis (e indesejáveis) do uso desnecessário do maxespecificador 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 ( varcharou nvarchar) e um comprimento explícito sensível.
Leitura adicional: