Question

Y a-t-il un avantage à utiliser int vs varbinary pour stocker les masques de bits en termes de performances ou de flexibilité?

Pour mes besoins, je ferai toujours des lectures sur ces masques de bits (pas d'écriture ni de mises à jour).

Était-ce utile?

La solution

Vous devez absolument utiliser un INT (si vous avez besoin de 32 drapeaux) ou un BIGINT (pour 64 drapeaux). Si vous avez besoin d'autres indicateurs, vous pouvez utiliser BINARY . a> (mais vous devriez probablement aussi vous demander pourquoi vous avez besoin de tant de drapeaux dans votre application).

En outre, si vous utilisez un type intégral, vous pouvez utiliser les opérateurs au niveau du bit. directement sans convertir un tableau d'octets en un type intégral.

Si vous avez besoin de plus d'indicateurs et que vous devez utiliser BINARY , vous perdez la prise en charge native des opérateurs au niveau des bits et par conséquent, une prise en charge facile du contrôle des valeurs des indicateurs. Je déplacerais probablement la vérification des valeurs d'indicateur vers une application cliente, mais si vous maîtrisez la programmation en T-SQL, c'est également une option. Si vous utilisez C #, vous disposez d'un BitArray classe avec les opérations nécessaires et en Java, vous avez une BitSet classe.

Autres conseils

Il est généralement préférable d'utiliser un groupe de colonnes de bits plutôt qu'un masque de bits. Ils seront emballés ensemble dans la page, de sorte qu'ils ne prendront plus de place. Bien que moi aussi, j’ai toujours l’air d’aller avec une colonne int ou bigint pour éviter toute saisie de nom de colonne .. mais avec intellisense, j’irais probablement avec les colonnes de bits.

Bien, étant donné qu’un int a moins d’espace de stockage et qu’il est généralement un peu plus facile à travailler, je ne sais pas pourquoi vous utiliseriez un varbinary.

Je suis généralement d'accord avec la réponse de @ hainstech d'utiliser des champs de bits, car vous pouvez nommer explicitement chaque champ de bits pour indiquer ce qu'il doit stocker. Cependant, je n'ai pas vu d'approche pratique pour comparer les masques de bits avec les champs de bits. Avec les opérateurs au niveau des bits de SQL Server (& amp;, |, etc ...), il est facile de savoir si une plage d'indicateurs est définie. Cela demande beaucoup plus de travail avec des opérateurs d’égalité sur un grand nombre de champs de bits.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top