Pergunta

Existe alguma vantagem de usar int vs varbinary para armazenar máscaras de bits em termos de desempenho ou de flexibilidade.

Para os meus propósitos, eu vou sempre estar fazendo lê sobre essas máscaras de bits (não escreve ou atualizações).

Foi útil?

Solução

Você deve definitivamente usar um INT (se precisar de 32 bandeiras) ou BIGINT (para 64 bandeiras). Se você precisar de mais bandeiras você poderia usar BINARY (mas você provavelmente deve também perguntar por que você precisa de tantos bandeiras em seu aplicativo).

Além disso, se você usar um tipo integral, você pode usar padrão bit a bit operadores directamente sem conversão de uma matriz de bytes para um tipo integral.

Se você precisar de mais bandeiras e tem que usar BINARY você perde suporte nativo para operadores bit a bit e, portanto, fácil suporte para verificação de valores de bandeira. Eu provavelmente iria passar a verificação de valores bandeira para um aplicativo cliente, mas se você estiver programação confortável em T-SQL que é uma opção também. Se você estiver usando C # você tem um BitArray classe com as operações necessárias e, em Java você tem um BitSet classe .

Outras dicas

É geralmente considerado preferível usar um monte de colunas bit em vez de uma máscara de bits. Eles vão começar embalado em conjunto com a página, então eles não vão ter mais espaço. Embora eu também sempre parecem ir com um int ou coluna bigint para evitar todo o nome da coluna de digitação .. mas com intellisense eu provavelmente iria com as colunas bit.

Bem, considerando um int tem menos espaço de armazenamento e é geralmente um pouco mais fácil trabalhar com que eu não sei por que você usaria um varbinary.

Eu costumo concordar com a resposta de @ hainstech de usar campos de bits, porque você pode explicitamente nomear cada campo de bits para indicar o que deve armazenar. No entanto eu não vi uma abordagem prática para fazer comparações bitmask com campos de bits. Com operadores bit a bit do SQL Server (&, |, etc ...), é fácil descobrir se uma série de sinalizadores estão definidos. Um muito mais trabalho a fazer isso com operadores de igualdade contra um grande número de campos de bits.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top