
不管数据行中是否有NULL值,建表的时候是否允许NULL,数据页中的行都会有record attributes = NULL_BITMAP
而record attributes =NULL_BITMAP VARIABLE_COLUMNS 只是说明了数据行有可变长度数据类型并且不为NULL
所以SQLSERVER在任何情况下都会去扫描这个NULL 位图的,除了Record Attributes = No null bitmap
详细可以看一下SQL Server误区30日谈-Day6-有关NULL位图的三个误区

证明
建立测试环境

1 USE [pratice] 2 GO 3 4 5 --允许空,char类型 6 CREATE TABLE testnullchar(id INT,NAME CHAR(20) NULL) 7 GO 8 --不允许空,varchar类型 9 CREATE TABLE testnotnullvarchar(id INT ,NAME VARCHAR(20) NOT NULL) 10 GO 11 --不允许空,char类型 12 CREATE TABLE testnotnullchar(id INT ,NAME CHAR(20) NOT NULL) 13 GO 14 15 INSERT INTO [dbo].[testnullchar] ( [id],[Name] ) 16 SELECT 1,NULL UNION ALL 17 SELECT 2,'你' 18 GO 19 20 INSERT INTO [dbo].[testnotnullchar] ( [id],[NAME] ) 21 SELECT 1,'' UNION ALL 22 SELECT 2,'你' 23 GO 24 25 INSERT INTO [dbo].[testnotnullvarchar] ( [id],[NAME] ) 26 SELECT 1,'' UNION ALL 27 SELECT 2,'你' 28 GO 29 30 SELECT * FROM testnullchar 31 SELECT * FROM testnotnullchar 32 SELECT * FROM testnotnullvarchar

查看数据页

1 ------------------------------------------------------------------------
2 --TRUNCATE TABLE DBCCResult
3 INSERT INTO DBCCResult EXEC ('DBCC IND(pratice,testnullchar,-1) ')
4
5 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC
6
7
8 DBCC TRACEON(3604,-1)
9 GO
10 DBCC PAGE([pratice],1,15658,3)
11 GO
12
13
14 --------------------------------------------------------
15 --TRUNCATE TABLE DBCCResult
16 INSERT INTO DBCCResult EXEC ('DBCC IND(pratice,testnotnullvarchar,-1) ')
17
18 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC
19
20
21 DBCC TRACEON(3604,-1)
22 GO
23 DBCC PAGE([pratice],1,8353,3)
24 GO
25
26
27 --------------------------------------------------------
28 --TRUNCATE TABLE DBCCResult
29 INSERT INTO DBCCResult EXEC ('DBCC IND(pratice,testnotnullchar,-1) ')
30
31 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC
32
33
34 DBCC TRACEON(3604,-1)
35 GO
36 DBCC PAGE([pratice],1,37266,3)
37 GO
38
39
40
41 ----------------------------------------------------------------testnullchar表,因为testnullchar表没有可变长度数据类型,所以两行数据都是NULL_BITMAP

testnotnullvarchar表,因为testnotnullvarchar表有可变长度数据类型,所以第二行为NULL_BITMAP VARIABLE_COLUMNS

testnotnullchar表,跟testnullchar表一样

而NULL_BITMAP VARIABLE_COLUMNS只是说明了数据行中有可变长度类型的数据,不是说某个字段就是可变长度数据类型

题外话
其实这篇文章是我前天看到某篇文章特别而写的,觉得这个null bitmap要好好研究一下,以免被人误导
本人不喜欢某些人以泰山压顶之势去评论别人,你知道的某些东西可能不一定正确的,而别人不知道的东西,日后一定会知道的,只是时间问题
知道某样东西的时间问题,迟早问题,或者这就是技术人的通病,自己技术厉害了,就XXXXXX!!!


如有不对的地方,欢迎大家拍砖o(∩_∩)o 哈哈
