视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
SQLSERVER中NULL位图的作用
2020-11-09 07:52:21 责编:小采
文档


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

下载本文
显示全文
专题