Verbraucht eine SQL Server-Bit-Spalte wirklich ein ganzes Byte Speicherplatz?

20

Ich stöberte in SSMS herum und bemerkte, dass die "Größe" meiner INTSpalten 4 Bytes betrug (erwartet), aber ich war ein bisschen schockiert, als ich sah, dass meine BITSpalten ein ganzes Byte waren.

Habe ich falsch verstanden, was ich sah?

Nate
quelle
1
Ich hätte das Glück, dass BIT-Spalten an einer Byte-Grenze anstatt an einer Wortgrenze ausgerichtet sind.
Mike Sherrill 'Cat Recall'

Antworten:

17

Wie viele Bitspalten haben Sie in der Tabelle definiert? Ich fand dieses auf MSDN, es sagt, dass 8 oder weniger Bitspalten als ein Byte gespeichert werden.

http://msdn.microsoft.com/en-us/library/ms177603.aspx

SQLRockstar
quelle
Akzeptiert für MSDN-Quelle, die ich nicht gefunden habe. Vielen Dank.
Nate
14

Ja.

Wenn Sie nur eine bitSpalte in der Tabelle haben, verwendet der Speicher a, es können bytejedoch bis zu 8 bitSpalten in demselben Byte gespeichert werden, sodass die nächsten 7 in dieser Hinsicht "frei" sind.

Es gibt auch einen Speicherbedarf von 1 Bit pro Spalte für das NULL_BITMAP(wieder aufgerundet auf das nächste Byte). Auf den Datenseiten enthält dies ein bitfür alle Spalten, unabhängig davon, ob sie zulässig sind oder nicht NULL(mit Ausnahme der später als Metadaten hinzugefügten nullwertfähigen Spalten, die sich nur ändern, ALTER TABLEwenn die Zeile noch nicht aktualisiert wurde).

Martin Smith
quelle
9

BITverwendet ein Byte pro Zeile, aber Sie können bis zu 8 BITFelder in diesen Ein-Byte-Speicher packen .

Das erste Feld kostet also ein Byte, die nächsten sieben sind frei !

JNK
quelle