实验证明SQL SERVER中的NULL值是否占用存储空间。

本学期有一门数据库管理的课程,老师最近在教学平台上发布了一道作业——SQL SERVER中的NULL值是否占用存储空间?

该作业要求学生用实验证明自己的结论。现在把整个实验证明过程记录如下。

一、过程

1、首先创建一个数据库为Test_hedong,并在该数据库下创建两个表,一个表为fixed_hedong,其中包括三个字段,允许为NULL值的字

      段为定长字段。另一个表variable_hedong包含四个字段,包括允许为NULL值在内的字段有三个变长字段。随后向两个表中分别插入一

      条数据,允许为NULL值的字段都插入NULL值。代码如下。

USE Test_hedong
GO
create table fixed_hedong
(
col1_hedong INT not null,
col2_hedong char(10) not null,
col3_hedong char(3) null,
)

create table variable_hedong
(
col1_hedong INT not null,
col2_hedong varchar(7) not null,
col3_hedong varchar(3) null,
col4_hedong varchar(10) not null
)
GO
insert into fixed_hedong values(123,'hedong',NULL)
insert into variable_hedong values(123,'hedong',null,'hedong')
GO

2、在查询中输入以下DBCC指令,其中第二行指令中的第一个参数为数据库名,第二个参数为数据库对象名,这里为第一张表的名字。

      不出错的话会得到如图的file_id和page_id的值,分别为1,21

dbcc traceon(3604)
dbcc extentinfo(Test_hedong,fixed_hedong)

3、再输入以下DBCC指令,第一个参数为数据库名,第二个参数为file_id,第三个参数为page_id,最后一个参数输入2就可以了。将会得 

      到如图的结果:

dbcc page(Test_hedong,1,21,2)

    看到右边“hedong”了吗?它左边的数据就是我们刚才插入的数据(10001500 7b000000 6865646f 6e672020 20200000 00030004),

    将它记录下来,待会儿分析会用到。

4、现在来看第二张表,同样的方法输入DBCC指令,将表名改为第二张表的名字,此时又会得到另一个file_id和page_id,分别为1,55。

dbcc extentinfo(Test_hedong,variable_hedong)

5、再输入以下DBCC指令,将会得到如图的结果:

dbcc page(Test_hedong,1,55,2)

      看见右边的"hedonghedong"了吗?这就是刚才在第二张表插入的数据,它左边的数据(30000800 7b000000 04000403 00190019

      001f0068 65646f6e 67686564 6f6e67)记录下来,待会用来分析。

二、分析:

  1. 存放NULL值为定长字段的数据行:

    10001500 7b000000 6865646f 6e672020 20200000 00030004

    其中”10”为状态位A,它的值是0X10,二进制表示为0001 0000,可看出只有位4是1,其他位都是0,所以该记录

    没有变长字段。后面”00”是在记录中未用。”1500”交换字节后是0X0015,值为21,代表找到字段数的位置在21字

    节之后。”7b000000”为col1_hedong数据,即123。”6865646f 6e6720202020”为col2_hedong数据,即”hedong”,

    后面的20202020代表空格,因为该字段为定长char(10)。再后面”000000”即代表NULL值,可看出他是占用了存储

    空间的。”0300”即是在21字节之后,它代表的是字段数,交换字节后是0X0003,代表存在3个字段。最后04是

    NULL位图,二进制表示为0100,只有第三位是1,表示第3个字段是NULL。

  2. 存放NULL值为变长字段的数据行:

    30000800 7b000000 04000403 00190019 001f0068 65646f6e 67686564 6f6e67

    其中”30”是状态位A,它的二进制表示为0011 0000,可看出位4和位5是1,所以存在变长字段。后面”00”在该记录中未用。

    ”0800”交换字节后是0X0008,十进制表示8,即为在第8字节之后找到字段数。”7b000000”为col1_hedong数据,即123。

    ”0400”即是字段数,交换字节后为0X0004,表示存在4个字段。04是NULL位图,二进制表示为0100,只有第三位是1,

    表示第3个字段是NULL。后面”0300”是变长字段数,交换字节后是0X0003,表示有3个变长字段。”1900”表示第一个变

    长字段结束位置,再后面”1900”表示第二个变长字段结束位置。这里可看出第二个变长字段实际长度为0,表示没有任何

    数据存储在变长数据区域,所以可知该变长字段值为NULL值。”1f00”为第三个变长字段结束位置。后面两个” 6865646f

    6e67”分别为col2_hedong字段和col3_hedong字段的值。

所以可得出结论:在SQL SERVER中,定长记录的NULL值占用存储空间,而变长记录的NULL值

不占用存储空间。

猜你喜欢

转载自blog.csdn.net/h2503652646/article/details/84991240