web-dev-qa-db-fra.com

Type de données pour stocker un tableau de drapeaux (un tableau bitmap / bit)

J'ai besoin de stocker un tableau de bits pour chaque enregistrement d'une table, en soutenant les opérations suivantes:

  • Test si un bit est défini et définissez un peu (en utilisant SQL)

  • Interrogation et réglage de la valeur à l'aide de ADO 2.8 (pas ado.net)

  • Indexation (afin de bénéficier de la fonctionnalité "Index de couverture")

Le nombre maximal de bits à stocker dans ce tableau est fixé, mais peut dépasser 32. C'est-à-dire une colonne SIMPLE INT ne fonctionne pas toujours.

D'après ce que j'ai vu jusqu'à présent, mes options sont:

  1. Utilisez plusieurs int colonnes
  2. Utilisez Bigint (fonctionne aussi longtemps que le nombre de bits est <= 64)
  3. Utilisez binaire
  4. ?

La première option fonctionnerait, mais nécessite un peu de refactoring dans le code qui accède aux données. La deuxième option est un relief temporaire uniquement et de mes recherches jusqu'à présent, je ne suis pas trop sûr si ADO fonctionne bien avec Bigint. Je n'ai aucune expérience avec binaire, et je ne suis au courant d'aucune autre option.

Quel type de données choisiriez-vous, étant donné les exigences?

15
krlmlr

Si tout ce que vous avez besoin pour stocker est un nombre modéré de valeurs vraies/fastes, vous pouvez utiliser le type de données bit.

En interne, SQL Server stocke bit colonnes emballées en octets "morceaux". Donc, jusqu'à 8 bit colonnes de votre table, SQL stocke que comme un octet emballé 1 octet; 9-16 bit colonnes dans 2 octets, etc.

Cela ne semble pas que vous allez aborder la limite de colonne, cela semble donc assez simple. Et bien sûr, les garder joliment séparés comme si cela vous permet de nommer les colonnes de lisibilité et d'obtenir toutes les possibilités d'indexation que vous voudrez normalement (si les indicateurs sont hautement sélectifs, des index filtrés peuvent être utiles si vous pouvez cibler 2008+).

Faire le bit-Emballage vous-même rendra beaucoup plus convoluté pour indexer (probablement calculé et indexé bit colonnes pour représenter chaque position du masque ... mais vous êtes alors pire vs. Utilisation de bit directement).

4
Jon Seigel