Devo usar varchar(255)
ou varchar(256)
ao projetar tabelas? Ouvi dizer que um byte é usado para o comprimento da coluna ou para armazenar metadados.
Isso importa mais neste momento?
Vi algumas postagens na internet, porém elas se aplicam ao Oracle e MySQL.
Temos o Microsoft SQL Server 2016 Enterprise Edition, como isso se aplica a esse ambiente?
Agora diga, por exemplo, e se eu disser aos meus clientes para manter, por exemplo, uma descrição de texto com 255 caracteres em vez de 256, existe alguma diferença? O que eu li "Com um comprimento máximo de 255 caracteres, o DBMS pode optar por usar um único byte para indicar o comprimento dos dados no campo. Se o limite fosse de 256 ou mais, seriam necessários dois bytes". Isso é verdade?
Respostas:
Dimensione cada coluna adequadamente. NÃO use um tamanho "padrão" para cada coluna. Se você precisa apenas de 30 caracteres, por que criar uma coluna que pode lidar com 255? Estou tão feliz que você não está advogando o uso
varchar(max)
para suas colunas de string.Esse é um conselho especialmente prudente se você precisar indexar uma coluna ou se estiver usando uma coluna como chave primária e ela tiver referências de chave estrangeira. O SQL Server usa o tamanho de cada coluna em seu otimizador de consultas para entender os requisitos estimados de memória para o processamento de consultas. Ter colunas superdimensionadas pode ser prejudicial ao desempenho.
Índices em colunas que são grandes demais podem resultar na geração de erros:
A tentativa de criar o índice acima resulta neste aviso:
900 bytes é o tamanho máximo da chave para índices em cluster (e índices não em cluster no SQL Server 2012 e versões anteriores). 1700 bytes é o tamanho máximo da chave para índices não agrupados em cluster nas versões mais recentes do SQL Server. Se você projetar colunas com uma largura genérica, como (255), poderá executar esse aviso com muito mais frequência do que o esperado.
Caso você esteja interessado em armazenamento interno, use o pequeno teste a seguir para entender melhor como o SQL Server armazena dados não compactados do armazenamento de linhas.
Primeiro, criaremos uma tabela na qual podemos armazenar colunas de vários tamanhos:
Agora vamos inserir uma única linha:
Esta consulta usa as funções não documentadas e não suportadas
sys.fn_RowDumpCracker
esys.fn_PhyslocCracker
para mostrar alguns detalhes interessantes sobre a tabela:A saída será semelhante a esta:
Como você pode ver, o
InRowLength
valor de cada valor é mostrado, juntamente com o local de armazenamento físico de cada linha - o "file_id", "page_id" e "slot_id".Se pegarmos os valores
file_id
epage_id
dos resultados da consulta acima e executáDBCC PAGE
-los, podemos ver o conteúdo físico real da página:Os resultados da minha máquina são:
fonte
Outros já apontaram que o número de bytes necessários para armazenar o comprimento é fixo. Eu queria me concentrar nessa parte da sua pergunta:
Sua pergunta foi marcada com a edição empresarial, o que geralmente significa que você terá uma quantidade razoável de dados. Frequentemente, diferenças de um byte por linha realmente não importam muito na prática. Por exemplo, a tabela a seguir com uma
VARCHAR(255)
coluna totalmente preenchida ocupa 143176 KB de espaço em disco:Resultados:
Vamos criar uma segunda tabela com uma
VARCHAR(256)
coluna totalmente preenchida . Isso vai levar pelo menos mais um byte por linha, certo?Resultados:
Acontece que ambas as tabelas ocupam a mesma quantidade de espaço. O mesmo número de linhas cabe em cada página de 8k. É ótimo que você queira gastar tempo otimizando seu aplicativo, mas suspeito que é melhor você se concentrar em diferentes áreas.
fonte
O tamanho declarado do varchar não tem impacto no desempenho. Os dados podem realmente ser armazenados como um armazenamento de linhas com compactação de página ou compactação de linha. Como um armazenamento de colunas em cluster ou como uma tabela com otimização de memória. Cada uma delas terá diferentes trocas de desempenho, mas nunca importa se você declara um varchar (255) ou varchar (256).
fonte