当前位置: 数据库>sqlserver
SQL Server误区30日谈 第6天 有关NULL位图的三个误区
来源: 互联网 发布时间:2014-10-09
本文导语: 这样还能减少CPU缓存命中失效的问题(点击这个链接来查看CPU的缓存是如何工作的以及MESI协议)。下面让我们来揭穿三个有关NULL位图的普遍误区。 误区 #6a:NULL位图并不是任何时候都会用到 正确 就算表中不存在允许NULL的列,NULL...
这样还能减少CPU缓存命中失效的问题(点击这个链接来查看CPU的缓存是如何工作的以及MESI协议)。下面让我们来揭穿三个有关NULL位图的普遍误区。
误区 #6a:NULL位图并不是任何时候都会用到
正确
就算表中不存在允许NULL的列,NULL位图对于数据行来说会一直存在(数据行指的是堆或是聚集索引的叶子节点)。但对于索引行来说(所谓的索引行也就是聚集索引和非聚集索引的非叶子节点以及非聚集索引的叶子节点)NULL位图就不是一直有效了。
下面这条语句可以有效的证明这一点:
CREATE TABLE NullTest (c1 INT NOT NULL);
CREATE NONCLUSTERED INDEX
NullTest_NC ON NullTest (c1);
GO
INSERT INTO NullTest VALUES (1);
GO
EXEC sp_allocationMetadata 'NullTest';
GO
你可以通过我的博文:Inside The Storage Engine: sp_AllocationMetadata - putting undocumented system catalog views to work.来获得sp_allocationMetadata 的实现脚本。
DBCC TRACEON (3604);
DBCC PAGE (foo, 1, 152, 3); -- page ID from SP output
where Index ID = 0
DBCC PAGE (foo, 1, 154, 1); -- page ID from SP output
where Index ID = 2
GO
首先让我们来看堆上这页Dump出来的结果
Slot 0 Offset 0x60 Length 11
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Memory Dump
@0x685DC060
再来看非聚集索引上的一页Dump出来的结果:
Slot 0, Offset 0x60, Length 13, DumpStyle BYTE
Record Type = INDEX_RECORD Record Attributes =
SQL Server误区30日谈 第23天 有关锁升级的误区
SQL Server误区30日谈 第28天 有关大容量事务日志恢复模式的误区
SQL Server误区30日谈 第17天 有关页校验和的误区
SQL Server误区30日谈 第29天 有关堆碎片的误区
SQL Server误区30日谈 第25天 有关填充因子的误区
SQL Server误区30日谈 第8天 有关对索引进行在线操作的误区
SQL Server误区30日谈 第5天 AWE在64位SQL SERVER中必须开启
SQL Server误区30日谈 第7天 一个实例多个镜像和日志传送延迟
SQL Server误区30日谈 第22天 资源调控器可以调控IO
SQL Server误区30日谈 第16天 数据的损坏和修复
SQL Server误区30日谈 第3天 即时文件初始化特性可以在SQL Server中开启和关闭
SQL Server误区30日谈 第21天 数据损坏可以通过重启SQL Server来修复
SQL Server误区30日谈 第10天 数据库镜像在故障发生后 马上就能发现
SQL Server误区30日谈 第27天 使用BACKUP WITH CHECKSUM可以替代DBCC CheckDB
SQL Server误区30日谈 第1天 正在运行的事务在服务器故障转移后继续执行
SQL Server误区30日谈 第9天 数据库文件收缩不会影响性能
SQL Server误区30日谈 第4天 DDL触发器就是INSTEAD OF触发器
SQL Server误区30日谈 第18天 有关FileStream的存储,垃圾回收以及其它
SQL Server误区30日谈 第11天 镜像在检测到故障后瞬间就能故障转移
误区 #6a:NULL位图并不是任何时候都会用到
正确
就算表中不存在允许NULL的列,NULL位图对于数据行来说会一直存在(数据行指的是堆或是聚集索引的叶子节点)。但对于索引行来说(所谓的索引行也就是聚集索引和非聚集索引的非叶子节点以及非聚集索引的叶子节点)NULL位图就不是一直有效了。
下面这条语句可以有效的证明这一点:
代码如下:
CREATE TABLE NullTest (c1 INT NOT NULL);
CREATE NONCLUSTERED INDEX
NullTest_NC ON NullTest (c1);
GO
INSERT INTO NullTest VALUES (1);
GO
EXEC sp_allocationMetadata 'NullTest';
GO
你可以通过我的博文:Inside The Storage Engine: sp_AllocationMetadata - putting undocumented system catalog views to work.来获得sp_allocationMetadata 的实现脚本。
让我们通过下面的script来分别查看在堆上的页和非聚集索引上的页:
代码如下:
DBCC TRACEON (3604);
DBCC PAGE (foo, 1, 152, 3); -- page ID from SP output
where Index ID = 0
DBCC PAGE (foo, 1, 154, 1); -- page ID from SP output
where Index ID = 2
GO
首先让我们来看堆上这页Dump出来的结果
代码如下:
Slot 0 Offset 0x60 Length 11
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Memory Dump
@0x685DC060
再来看非聚集索引上的一页Dump出来的结果:
代码如下:
Slot 0, Offset 0x60, Length 13, DumpStyle BYTE
Record Type = INDEX_RECORD Record Attributes =