您的当前位置:首页正文

SQLSERVER中NULL位图的作用

2020-11-09 来源:爱够旅游网

不管数据行中是否有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

View 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 哈哈

显示全文