Eu tenho uma tabela que contém informações muito básicas. Apenas um título e alguns campos de data. Há um campo chamado comments, que é varchar (4000). Na maioria das vezes, deixamos em branco, mas algumas vezes inserimos uma grande quantidade de dados aqui. Esse design é realmente ruim? Ou isso é apenas um pouco ineficiente?
Eu assumiria que a criação de uma tabela separada para esta coluna seria melhor.
nota: este é o sql server 2008
SPARSE
e não usandoSPARSE
...Respostas:
Para um desempenho mais previsível (e para evitar uma alta variação de linhas por página), eu gostaria de armazenar esses dados em uma tabela relacionada - especialmente se ele for preenchido apenas uma pequena porcentagem do tempo e, especialmente, se for recuperado apenas em algumas das consultas. As linhas em que esse valor está
NULL
contribuem para a sobrecarga de espaço, mas isso é mínimo. Mais importante será como uma página pode caber apenas duas linhas e a próxima página pode caber 500 linhas - isso pode realmente afetar as estatísticas e é melhor dividi-las para que sejam armazenadas separadamente e não afetem todas as suas operações. a tabela principal.fonte
Requer espaço mínimo quando não usado
A sobrecarga é mínima e a otimização será prematura.
Até você saber que tem um problema, mantenha-o em uma tabela. Você quebra o KISS introduzindo junções externas e adiciona uma sobrecarga na consulta dos dados.
Consulte /programming/3793022/how-to-come-to-limits-of-8060-bytes-per-row-and-8000-per-varchar-nvarchar-valu/3793265#3793265 para obter mais informações
fonte
Eu acho que uma tabela separada seria melhor para melhorar a densidade da página e reduzir a fragmentação, especialmente se você nem sempre preencher esse campo.
Todas essas páginas e ponteiros vazios levam a um desempenho ruim. Normalize esse campo, se puder.
fonte
Esta pergunta é muito parecida: as colunas vazias extras afetam significativamente o tamanho da tabela sql?
Parece que a resposta é sim, ela ocupa espaço, mas existe um algoritmo de compactação para colunas com muitos valores nulos.
Quanto ao design, acho que ter uma tabela externa vinculada a isso seria um design mais limpo. Ter uma coluna com valores nulos frequentes torna mais difícil para os usuários do banco de dados, pois eles podem usar acidentalmente um valor nulo se não tiverem cuidado. Portanto, o código que usa o banco de dados precisa conter a verificação de erros e fica feio a partir daí.
fonte
SPARSE
, e não apenas "colunas com muitos valores nulos".Você ficará bem - já é uma coluna varchar, portanto, ela só usa espaço quando contém dados. Se você tiver muitas colunas de tamanho fixo anuláveis, como int, poderá ter problemas de uso de espaço.
Quanto a colocá-lo em outra mesa, eu não me incomodaria. Você também pode usar varchar (max) e as opções de entrada / saída de linha. Mais uma vez, provavelmente prematuro.
fonte