Ich muss für jeden Datensatz einer Tabelle ein Bit-Array speichern, das die folgenden Operationen unterstützt:
Testen, ob ein Bit gesetzt ist, und Setzen eines Bits (unter Verwendung von SQL)
Abfragen und Festlegen des Werts mit ADO 2.8 (nicht ADO.NET)
Indizierung (um von der Funktion "Deckungsindex" zu profitieren)
Die maximale Anzahl der in diesem Array zu speichernden Bits ist festgelegt, kann jedoch 32 überschreiten . Das heißt, eine einfache int- Spalte funktioniert nicht immer.
Nach dem, was ich bisher gesehen habe, sind meine Optionen:
- Verwenden Sie mehrere int- Spalten
- Benutze bigint (funktioniert solange die Anzahl der Bits <= 64 ist)
- Verwenden Sie die Binärdatei
- ?
Die erste Option würde funktionieren, erfordert jedoch einige Umgestaltungen im Code, der auf die Daten zugreift. Die zweite Option ist nur eine vorübergehende Erleichterung, und nach meinen bisherigen Recherchen bin ich mir nicht sicher, ob ADO mit bigint so gut funktioniert . Ich habe keine Erfahrung mit Binärdateien und kenne keine anderen Optionen.
Welchen Datentyp würden Sie angesichts der Anforderungen wählen?
Wenn Sie nur eine moderate Anzahl von Wahr / Falsch-Werten speichern müssen, können Sie den
bit
Datentyp verwenden.Intern speichert SQL Server
bit
Spalten, die in Byte "Chunks" gepackt sind. Für bis zu 8bit
Spalten in Ihrer Tabelle speichert SQL diese als gepacktes 1 Byte. 9-16bit
Spalten in 2 Bytes und so weiter.Es hört sich nicht so an, als würden Sie sich dem Spaltenlimit nähern. Das scheint also ziemlich einfach zu sein. Und natürlich können Sie die Spalten zur besseren Lesbarkeit benennen und alle Indizierungsmöglichkeiten abrufen, die Sie normalerweise hätten (wenn die Flags sehr selektiv sind, können gefilterte Indizes hilfreich sein, wenn Sie auf 2008+ abzielen).
Wenn Sie das Bit-Packen selbst durchführen, ist die Indizierung sehr viel komplizierter (wahrscheinlich berechnete und indizierte
bit
Spalten, um jede Position der Maske darzustellen ... aber dann haben Sie es schlechter alsbit
direkt).quelle