Eu tenho alguns bancos de dados criados usando o Entity Framework Code First; os aplicativos estão funcionando e, em geral, estou muito feliz com o que o Code First me permite fazer. Eu sou um programador primeiro, e um DBA segundo, por necessidade. Estou lendo sobre DataAttributes para descrever melhor em C # o que eu quero que o banco de dados faça; e minha pergunta é: qual penalidade vou comer ao ter essas nvarchar(max)
cordas na minha mesa (veja o exemplo abaixo)?
Existem várias colunas nesta tabela específica; em C # eles são definidos da seguinte maneira:
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string Name { get; set; }
public string Message { get; set; }
public string Source { get; set; }
public DateTime Generated { get; set; }
public DateTime Written { get; set; }
Espero consultar e / ou classificar com base em Nome, Origem, Gerado e Escrito. Espero que Nome e Origem tenham entre 0 e 50 caracteres, ocasionalmente até 150. Espero que esta tabela comece muito pequena (<100k linhas), mas cresça significativamente ao longo do tempo (> 1m linhas). Obviamente, a mensagem pode ser pequena ou grande e provavelmente não será consultada.
O que eu quero saber é que há um impacto no desempenho das minhas colunas Nome e Origem sendo definidas como nvarchar(max)
quando eu nunca espero que elas tenham mais de 150 caracteres?
varchar(max)
qualquer lugar prejudica seu desempenho - não faça isso! Use tipos de dados apropriados - use varchar(max)
SOMENTE se você REALMENTE precisar de mais de 8000 caracteres! (Nunca vi tanto o nome ou o email de uma pessoa!) - Veja Qual é o sentido de usar o VARCHAR (n) mais? para mais informações
[MaxLength]
ou[StringLength]
atributos. Alguns fatores negativos possíveis adicionais de colunas demasiado largas são mencionados na resposta de @ PaulWhite aqui