Eu li sobre isso nos fóruns do MSDN e aqui e ainda não estou certo. Acho que isso está correto: Varchar (max) será armazenado como um tipo de dados de texto, o que tem desvantagens. Então, digamos que seu campo tenha menos de 8.000 caracteres. Como um campo BusinessName em minha tabela de banco de dados. Na realidade, o nome de uma empresa provavelmente sempre terá (tirando um número da minha cartola) de 500 caracteres. Parece que muitos campos varchar que encontrei se enquadram na contagem de 8k caracteres.
Portanto, devo tornar esse campo um varchar (500) em vez de varchar (8000)? Pelo que entendi de SQL não há diferença entre os dois. Portanto, para facilitar a vida, gostaria de definir todos os meus campos varchar como varchar (8000). Isso tem alguma desvantagem?
Relacionado: Tamanho das colunas varchar (não achei que este respondesse minha pergunta).
fonte
Respostas:
Do ponto de vista do processamento, não fará diferença usar varchar (8000) versus varchar (500). É mais um tipo de coisa de "boa prática" definir um comprimento máximo que um campo deve conter e tornar seu varchar desse comprimento. É algo que pode ser usado para auxiliar na validação de dados. Por exemplo, fazer com que uma abreviatura de estado tenha 2 caracteres ou um código postal / CEP com 5 ou 9 caracteres. Essa costumava ser uma distinção mais importante para quando seus dados interagiam com outros sistemas ou interfaces de usuário onde o comprimento do campo era crítico (por exemplo, um conjunto de dados de arquivo simples de mainframe), mas hoje em dia acho que é mais um hábito do que qualquer outra coisa.
fonte
Um exemplo em que isso pode fazer a diferença é que pode impedir uma otimização de desempenho que evita adicionar informações de versão de linha a tabelas com acionadores posteriores.
Isso é coberto pelo SQL Kiwi aqui
Da mesma forma, se estiver usando tabelas com otimização de memória desde 2016, foi possível usar colunas LOB ou combinações de larguras de coluna que poderiam potencialmente exceder o limite de inrow, mas com uma penalidade.
Isso pode ter um grande efeito negativo no consumo de memória e no desempenho
Outro caso em que declarar larguras de coluna em excesso pode fazer uma grande diferença é se a tabela será processada usando o SSIS. A memória alocada para colunas de comprimento variável (não BLOB) é fixa para cada linha em uma árvore de execução e está de acordo com o comprimento máximo declarado das colunas, o que pode levar ao uso ineficiente de buffers de memória (exemplo) . Embora o desenvolvedor do pacote SSIS possa declarar um tamanho de coluna menor do que a fonte, é melhor fazer essa análise antecipadamente e aplicá-la lá.
De volta ao próprio mecanismo do SQL Server, um caso semelhante é que, ao calcular a concessão de memória a ser alocada para
SORT
operações, o SQL Server presume que asvarchar(x)
colunas irão, em média, consumirx/2
bytes.Se a maioria de suas
varchar
colunas estiver mais cheia do que isso, isso pode levar aosort
extravasamento das operaçõestempdb
.No seu caso, se suas
varchar
colunas forem declaradas como8000
bytes, mas na verdade tiverem conteúdo muito menor do que isso, sua consulta terá memória alocada que não requer, o que é obviamente ineficiente e pode levar a esperas por concessões de memória.Isso é abordado na Parte 2 do Webcast 1 de Workshops de SQL, que pode ser baixado aqui ou veja abaixo.
fonte
char(4)
já que há uma sobrecarga de 2 bytes por coluna de variável.Além das melhores práticas (resposta de BBlake)
fonte
nvarchar
evarchar
, isso significa apenas que os espaços finais são preservados na inserção - não que os valores são preenchidos com espaços para o tamanho da coluna, como emchar
enchar
.Existem algumas desvantagens em colunas grandes que são um pouco menos óbvias e podem pegar você um pouco mais tarde:
Como regra geral, tente ser conservador com a largura da coluna. Se se tornar um problema, você pode facilmente expandi-lo para atender às necessidades. Se você notar problemas de memória mais tarde, reduzir uma coluna grande mais tarde pode se tornar impossível sem perder dados e você não saberá por onde começar.
Em seu exemplo de nomes de empresas, pense onde você consegue exibi-los. Existe realmente espaço para 500 caracteres ?? Caso contrário, não faz sentido armazená-los como tais. http://en.wikipedia.org/wiki/List_of_companies_of_the_United_States lista alguns nomes de empresas e o máximo é cerca de 50 caracteres. Então, eu usaria 100 para o máximo da coluna. Talvez mais como 80.
fonte
O ideal é que você deseje ser menor do que isso, até um tamanho razoável (500 não é um tamanho razoável) e garantir que a validação do cliente detecte quando os dados ficarão muito grandes e envie um erro útil.
Embora o varchar não vá realmente reservar espaço no banco de dados para o espaço não utilizado, lembro-me de versões do SQL Server que reclamaram que as linhas do banco de dados eram mais largas do que um certo número de bytes (não me lembro da contagem exata) e realmente descartando quaisquer dados não cabem. Um certo número desses bytes foi reservado para coisas internas ao SQL Server.
fonte