Alguém estava revisando meu código DDL para criar tabelas e sugeriu, quando viram que eu vi usando VARCHAR(256)
campos para texto, espero que sejam bem pequenos, como um primeiro nome ou qualquer outra coisa, que eu deveria sempre usar VARCHAR(MAX)
e vincular Por que usar qualquer coisa além de varchar (max ) . Eu li, mas parecia datado, pois estava focado em 2005, e não parecia oferecer nenhuma justificativa real para alocar potencialmente até 2 GB por linha em todos os campos de texto.
De um ponto de vista de desempenho, armazenamento etc., como alguém deve decidir se deve usar VARCHAR(MAX)
ou um tipo menor e mais específico para versões modernas do SQL Server? (por exemplo, 2008, 2012, 2014)
Não.
Para SQL Server, os
max
tipos de dados só devem ser especificados quando não houver alternativa. Em vez disso, deve-se escolher o tipo de base correto (varchar
ounvarchar
) e especificar um comprimento máximo explícito que seja apropriado para os dados a serem armazenados.O armazenamento físico é idêntico se a coluna for digitada como
varchar(n)
ouvarchar(max)
, portanto, essa não é a preocupação.As razões para não escolher
(n)varchar(max)
em todos os lugares giram em torno de recursos, qualidade do plano e desempenho.Uma lista exaustiva provavelmente não é prática, mas entre outras coisas,
max
colunas:Características
max
tipos de dados. Nem todas as limitações e efeitos colaterais estão documentados.atuação
max
para corresponder às definições da colunaEm resumo, há tantos efeitos colaterais sutis (e indesejáveis) de usar desnecessariamente o
max
especificador que não faz sentido fazer isso. A pequena 'conveniência' de usar uma única declaração não é uma espécie de compensação.Avalie cada tipo no contexto, use o tipo base correto (
varchar
ounvarchar
) e um comprimento explícito sensato.Leitura adicional:
Isso vai parecer a resposta de um paranóico, mas não há apenas considerações de armazenamento e desempenho.
O próprio banco de dados não controla seus clientes, e não se pode presumir que os clientes sempre insiram entradas do usuário com segurança - mesmo que um banco de dados seja projetado para ser usado apenas com um aplicativo .net que usa o Entity Framework para encapsular transações e garantir consultas parametrizadas são usados sistematicamente, você não pode saber que sempre será o caso.
Eu não saberia exatamente como fazer isso, mas, ao criar todos os campos de texto
varchar(max)
, se um cliente tiver problemas nas Tabelas Bobby e/ou os parâmetros de seus procedimentos armazenados tambémvarchar(max)
, você estará facilitando a criação de um invasor um valor de parâmetro válido, mas inteligente, que pode fazer coisas que os clientes não deveriam estar fazendo - seja lá o que for.Ao limitar o comprimento ao que você realmente precisa, você não está se protegendo desses ataques inteligentes (nem tenho certeza de como é realmente chamado, só me lembro de ter lido sobre isso um tempo atrás), mas você não está dizendo " vá em frente, tente me dar um script de 2 GB para executar" também.