Estou tentando entender a melhor maneira de decidir o tamanho das colunas varchar, tanto das perspectivas de armazenamento quanto de desempenho.
Desempenho
Da minha pesquisa, pareceque varchar(max) só deve ser usado se você realmente precisar; isto é, se a coluna deve acomodar mais de 8000 caracteres, uma razão é a falta de indexação (embora eu suspeite um pouco da indexação em campos varchar em geral. Eu sou muito novo nos princípios de banco de dados, então talvez isso seja infundado ) e compressão (mais uma preocupação de armazenamento). Na verdade, em geral as pessoas parecem recomendar apenas usar o que você precisa, ao fazer varchar(n).... oversizing é ruim, porque as consultas devem levar em conta o tamanho máximo possível. Mas também foi afirmado que o mecanismo usará metade do tamanho indicado como uma estimativa do tamanho real médio dos dados. Isso implicaria que se deve determinar, a partir dos dados, qual é o tamanho médio, dobrá-lo e usá-lo como n. Para dados com variabilidade muito baixa, mas diferente de zero, isso implica em um superdimensionamento de até 2x sobre o tamanho máximo, o que parece muito, mas talvez não seja? Insights seriam apreciados.
Armazenamento
Depois de ler sobre como funciona o armazenamento em linha vs. fora de linha, e tendo em mente que o armazenamento real é limitado aos dados reais, parece-me que a escolha de n tem pouca ou nenhuma influência no armazenamento (além certificando-se de que é grande o suficiente para conter tudo). Mesmo usando varchar(max) não deve ter nenhum impacto no armazenamento. Em vez disso, um objetivo pode ser limitar o tamanho real de cada linha de dados a ~8.000 bytes, se possível. Isso é uma leitura precisa das coisas?
Contexto
Alguns dos dados de nossos clientes flutuam um pouco, então geralmente fazemos colunas um pouco mais largas do que precisam ser, digamos 15-20% maiores, para essas colunas. Eu queria saber se havia outras considerações especiais; por exemplo, alguém com quem trabalho me disse para usar tamanhos 2^n - 1 (não encontrei evidências de que isso seja uma coisa ....)
Estou falando da criação inicial da tabela. Um cliente nos dirá que vai começar a nos enviar uma nova tabela e enviar dados de amostra (ou apenas o primeiro conjunto de dados de produção), que analisamos e criamos uma tabela do nosso lado para armazenar os dados. Queremos fazer a tabela do nosso lado para lidar com importações futuras, bem como o que está na amostra. Mas, certas linhas tendem a ficar mais longas, então as preenchemos.
A questão é quanto, e existem diretrizes técnicas?