Sou responsável por criar um banco de dados em um projeto. Temos campos que raramente terão um valor (1 em cada 10.000 registros) e estou tentando descobrir a melhor maneira de armazenar isso no banco de dados.
Tanto quanto posso ver, tenho 3 opções:
- Adicione uma coluna na tabela para cada valor extra
- Adicione uma tabela vinculada que faça referência à tabela original e tenha registros apenas onde precisamos armazenar um valor
- Use o tipo de dados XML na tabela original e armazene todos os valores nela.
Existem outras opções que eu não considerei?
Estou tentando descobrir os prós e contras de cada método. Tanto quanto eu sei, 1 seria o mais fácil e 2 ocupariam menos espaço, mas estou lutando para encontrar muitos recursos para 3.
sql-server-2008
xml
Matthew Steeples
fonte
fonte
Respostas:
Parece que você precisa de colunas esparsas e índices filtrados e segue a opção 1. Esses são recursos totalmente suportados e documentados exatamente para esse cenário.
Não consigo imaginar uma solução XML com bom desempenho nesse cenário, ela terá uma enorme sobrecarga de metadados redundantes e demora na consulta.
fonte
Uma coluna anulável não ocupa espaço se o comprimento da variável no SQL Server. O fato de ser NULL é armazenado no bitmap NULL . Você pode indexá-lo, se necessário, com índices filtrados, para ignorar colunas NULL.
Adiciona complexidade quando você considera o ponto 1.
Não. Difícil de pesquisar, analisar etc: você vai se arrepender mais tarde
Também depende do tamanho: isso será char (1000) por alguns bilhões de linhas? Ou tinyint para 100k linhas? Se este último considerar a complexidade adicional do ponto 2: não vale a pena.
fonte
Com o SQL Server 2008, você tem a opção adicional de usar colunas esparsas, projetadas especificamente para a situação mencionada.
Eles têm o benefício adicional de que você pode visualizá-los como um objeto XML combinado usando XML COLUMN_SET ou referenciá-los individualmente e eles oferecem uma enorme economia de espaço.
Confira o seguinte artigo do blog para obter mais detalhes: http://www.sqlskills.com/BLOGS/PAUL/post/SQL-Server-2008-Sparse-columns-and-XML-COLUMN_SET.aspx
fonte
Uma quarta opção: não use tabelas. As tabelas são muito inadequadas para esse tipo de dados (de fato, para qualquer tipo de dados que não tenha sido ajustado à força em forma de tabela). Basta usar XML.
fonte