您当前位置:优侠库 > 资讯攻略 >
来源:未知
2021-11-16 18:26:36 浏览: 分类:资讯攻略

如何判断SQL Server BIT类型占用空间的多少?

本文主要讨论SQL Server的BIT类型在空中占多少。对于一般的INT、CHAR、tinyint等相关数据类型,它们所占用的存储空是以字节为单位的,但是位类型只有0和1或者false和true。

这种情况只能用一个BIT来表示,那么Bit类型在SQL Server中占了多少空的空间呢?是按位存储的吗?或者也许它存储在一个字节中?

两个答案都不对!实际上,位类型占用的空与位类型列所在的表的位置有关。在某些情况下,该位占用一个字节,而在另一些情况下,该位实际上占用几个位(几个位类型列共用一个字节)。下面详细分析一下:

1.单个位类型的列将占用一个字节。

Separate表示位类型列的左定长列和右定长列不是SQL Server位类型列。例如,这样一个表:

CREATETABLEtt ( c1INTPRIMARYKEY, c2BITNOTNULL, c3CHAR(2)NOTNULL )

SQL Server在存储表中的数据时,首先将表中的列按照原来的顺序分为固定长度和可变长度两组(可变长度是可变长度的数据类型,如varchar、nvarchar、varbinary等。).在数据页中存储数据时,首先存储所有固定长度的数据,然后存储可变长度的数据。这里,因为列c2的左边是int类型,右边是char类型,它们都是固定长度的,而不是BIT类型,所以必须在c1和c3之间留出一个字节来存储c2,尽管c2只使用其中一个位。

我们来验证一下是不是真的是我说的:

(1)插入一行数据:

INSERTINTOttVALUES(1,1,'aa')

(2)找到tt表数据第一页的文件号和页码(即刚刚插入的数据所在的页面):

SELECTfirst_page FROMsys.partitionsp INNERJOINsys.system_internals_allocation_unitsa ONp.partition_id=a.container_id WHEREOBJECT_IDOBJECT_ID=OBJECT_ID('dbo.tt')

我这里返回的是0x76 00 00 00 01 00,这里需要反过来才能看到0x00 01 00 00 00 76。前两个字节是文件号,后面是页码,所以文件号是1,页码是118(0x76换算成十进制是118)。

(3)使用DBCC页面命令查看页面的内部结构:

DBCCtraceon(3604) DBCCpage(TestDB,1,118,3)

这里,DBCC跟踪(3604)意味着直接输出页面内容。TestDB是我创建的tt表所在的数据库。1和118前面已经提到了。最后一个是打印选项。0表示只输出页眉;1不会输出所有内容,只会输出有数据的内容;2表示完整输出本页内容,3类似于1,但每条记录要单独列出列值。以下是需要注意的输出:

00000000:10000b0001000000016161030000††††††.........aa...

数据线的具体格式这里就不多说了,在SQL Server 2005技术内幕存储引擎中有详细描述。我们插入的数据从第5个字节开始,即01000000 016161。01000000这里是c1,因为是int类型,所以占用了4个字节。接下来01是c2,这里占了1个字节。接下来,6161是c3。

2.多个位类型列由可变长度数据类型列分隔。

去掉变长列,再看连续SQL Server位列的数量,每列占一位,如果多了八列,那就多占字节。例如,创建如下表格:

CREATETABLEvtt ( c1BITNOTNULL, c2VARCHAR(5)NOTNULL, c3BITNOTNULL, c4NVARCHAR(5)NULL, c5BITNULL, c6INTNOTNULL )

这里,过滤掉变长列后,它们变成c1、c3、c5和c6。有三个连续的位类型列,因此c1、c3和c5将共享一个字节。接下来,我们来验证一下:

(1)插入一条样本数据:

INSERTINTOvttVALUES(1,'abc',1,N'xyz',0,1023)

(2)使用与前面SQL语句相同的方法,查出vtt表的第一页是0xC00000000100,对应的文件号是1,页码是192。

(3)检查本页的内部数据:

00000000:3000090003ff03000006000002001500†0.............. 00000010:1b00616263780079007a00†††††††††††††..abcx.y.z.

插入的数据从第5个字节03ff & hellip开始& hellip这里03是c1,c3,c5的数据。03转换成二进制时,就是0000011。列c1对应于最低位1,c3对应于倒数第二位1,c5对应于倒数第二位0。下一个ff是c6 1023的值。接下来是列数、空位图、变长列等。这里讨论空占用的比特,就不解释后者了。

3.一个表中有多列SQL Server位类型

该序列决定了这些位是否可以共享一个字节。在SQL Server中,它按列顺序存储。第一列和最后一列是位数据类型列,因此它们不能共享一个字节。

也就是说,下面的表t1和表t2占用的空是不一样的,t1数据占用7个字节,t2数据占用8个字节。

CREATETABLEt1 ( c1INTPRIMARYKEY, c2BITNOTNULL, c3BITNOTNULL, c4CHAR(2)NOTNULL ) CREATETABLEt2 ( c1INTPRIMARYKEY, c2BITNOTNULL, c4CHAR(2)NOTNULL, c3BITNOTNULL )

但是,在下面的表t3和t4中,它们的位列所占用的data 空是相同的,因为中间是变长数据类型。

CREATETABLEt3 ( c1INTNOTNULL, c2BITNOTNULL, c3VARCHAR(2)NOTNULL, c4BITNOTNULL ) CREATETABLEt4 ( c1INTNOTNULL, c2BITNOTNULL, c4BITNOTNULL, c3VARCHAR(2)NOTNULL )

以上相关内容是空 SQL Server位类型占用多少的介绍。希望你能有所收获。

关键词:SQL Server

优侠库网站每天提供最新最热门的安卓手机软件、游戏下载、分享热门手游资讯攻略教程、手机软件教程步骤,专注安卓手机游戏软件下载。

本文链接:http://www.123down.cn/gonglue/227389.html

攻略资讯
安卓软件
安卓游戏