I was poking around SSMS and noticed the "size" of my
INT columns were 4 bytes (expected) but I was a bit shocked to see my
BIT columns were a whole byte.
Did I misunderstand what I was looking at?
How many bit columns do you have defined in the table? I found this on MSDN, it says 8 or less bit columns are stored as one byte.
If you only have one
bit column in the table then storage uses a
byte but up to 8
bit columns can be stored in the same byte so the next 7 are "free" in that respect.
There is also a 1 bit per column storage need for the
NULL_BITMAP (again rounded up to the next byte). In the data pages this contains a
bit for all columns irrespective of whether or not they allow
NULL (with the exception of nullable columns added later as a metadata only change via
ALTER TABLE where the row has not yet been updated)
BIT uses one byte per row, but you can pack up to 8
BIT fields into that one byte storage.
So the first field costs one byte, but the next seven are free!