Preciso armazenar uma matriz de bits para cada registro de uma tabela, suportando as seguintes operações:
Testando se um bit está definido e definindo um pouco (usando SQL)
Consultando e definindo o valor usando o ADO 2.8 (não o ADO.NET)
Indexação (para se beneficiar do recurso "índice de cobertura")
O número máximo de bits a serem armazenados nesta matriz é fixo, mas pode exceder 32 . Ou seja, uma coluna int simples nem sempre funciona.
Pelo que vi até agora, minhas opções são:
- Use várias colunas int
- Use bigint (funciona desde que o número de bits seja <= 64)
- Use binário
- ?
A primeira opção funcionaria, mas requer bastante refatoração no código que acessa os dados. A segunda opção é apenas um alívio temporário e, de minhas pesquisas até agora, não tenho muita certeza se o ADO funciona tão bem com bigint . Não tenho experiência com binário e não conheço outras opções.
Que tipo de dados você escolheria, considerando os requisitos?
Se tudo que você precisa armazenar for um número moderado de valores verdadeiro / falso, você poderá usar o
bit
tipo de dados.Internamente, o SQL Server armazena
bit
colunas compactadas em "pedaços" de bytes. Portanto, para até 8bit
colunas na sua tabela, o SQL armazena isso como um byte compactado; 9-16bit
colunas em 2 bytes e assim por diante.Não parece que você vai se aproximar do limite da coluna, então isso parece bem direto. E, é claro, mantê-las bem separadas dessa maneira permite nomear as colunas para facilitar a leitura e obter todas as possibilidades de indexação que você normalmente faria (se os sinalizadores forem altamente seletivos, os índices filtrados poderão ser úteis se você puder segmentar 2008 ou mais).
Se você fizer a compactação de bits, ficará muito mais complicado fazer a indexação (provavelmente
bit
colunas computadas e indexadas para representar cada posição da máscara ... mas você estará pior do que usandobit
diretamente).fonte