2.多个BIT类型的列之间使用变长数据类型列分开,则去掉变长列,然后看连续的BIT类型列的个数,每列占用一个位,如果多余了8列那就再占用更多的字节。例如创建这样的表:
create TABLE vtt
(
c1 BIT NOT NULL,
c2 VARchar(5) NOT NULL,
c3 BIT NOT NULL,
c4 NVARchar(5) NULL,
c5 BIT NULL,
c6 INT NOT NULL
)
这里将变长列筛选出来后就变成了c1、c3、c5、c6,有3个BIT类型列是连续的,所以c1、c3、c5将公用一个字节。接下来就来验证一下:
(1)插入一条示例数据:
insert INTO vtt VALUES(1,’abc’,1,N’xyz’,0,1023)
(2)用前面用的SQL语句,同样的方法,找出vtt表的第一页为:0xC00000000100,对应的就是文件号1,页号192
(3)查看该页的内部数据:
00000000: 30000900 03ff0300 00060000 02001500 0. ………….
00000010: 1b006162 63780079 007a00..abcx.y.z.
插入的数据从第5个字节开始03ff…… 这儿03就是c1、c3、c5的数据,03转换成二进制就是00000011。c1列对应最低位1,c3对应倒数第二位1,c5对应倒数第三位0。接下来的ff就是c6的值1023。后面的就是列数、NULL位图、变长列等,这里是讨论BIT位占用空间的,所以就不讲解后面这些了。
3.一个表中有多个BIT类型的列,其顺序是否连续决定了BIT位是否可以共享一个字节。SQL Server中按照列顺序存储,第一列和最后一列都是BIT数据类型列,不可以共用一个字节。
也就是说下面的表t1和表t2占用的空间是不同的,t1数据占用了7字节,t2数据占用了8字节。
create TABLE t1
(
c1 INT PRIMARY KEY,
c2 BIT NOT NULL,
c3 BIT NOT NULL,
c4 char(2) NOT NULL
)
create TABLE t2
(
c1 INT PRIMARY KEY,
c2 BIT NOT NULL,
c4 char(2) NOT NULL,
c3 BIT NOT NULL
)
但是在下面的t3和t4表中,由于中间是变长数据类型,所以他们的BIT列占用的数据空间是相同的。
create TABLE t3
(
c1 INT NOT NULL,
c2 BIT NOT NULL,
c3 VARchar(2) NOT NULL,
c4 BIT NOT NULL
)
create TABLE t4
(
c1 INT NOT NULL,
c2 BIT NOT NULL,
c4 BIT NOT NULL,
c3 VARchar(2) NOT NULL
)
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国