不管数据行中是否有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 testnotnullvarcharView Code
查看数据页
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 ----------------------------------------------------------------View Code
testnullchar表,因为testnullchar表没有可变长度数据类型,所以两行数据都是NULL_BITMAP
testnotnullvarchar表,因为testnotnullvarchar表有可变长度数据类型,所以第二行为NULL_BITMAP VARIABLE_COLUMNS
testnotnullchar表,跟testnullchar表一样
而NULL_BITMAP VARIABLE_COLUMNS只是说明了数据行中有可变长度类型的数据,不是说某个字段就是可变长度数据类型
题外话
其实这篇文章是我前天看到某篇文章特别而写的,觉得这个null bitmap要好好研究一下,以免被人误导
本人不喜欢某些人以泰山压顶之势去评论别人,你知道的某些东西可能不一定正确的,而别人不知道的东西,日后一定会知道的,只是时间问题
知道某样东西的时间问题,迟早问题,或者这就是技术人的通病,自己技术厉害了,就XXXXXX!!!
如有不对的地方,欢迎大家拍砖o(∩_∩)o 哈哈