CareySon 发表于 2013-1-4 01:22:06

SQL Server误区30日谈-Day6-有关NULL位图的三个误区

<div id="cnblogs_post_body">    本系列文章是我在sqlskill.com的PAUL的博客看到的,很多误区都比较具有典型性和代表性,原文来自T-SQL Tuesday #11: Misconceptions about.... EVERYTHING!!,经过我们团队的翻译和整理发布在AgileSharp上。希望对大家有所帮助。
 
    NULL位图是为了确定行中的哪一列是NULL值,哪一列不是。这样做的目的是当Select语句后包含存在NULL值的列时,避免了存储引擎去读所有的行来查看是否是NULL,从而提升了性能。这样还能减少CPU缓存命中失效的问题(点击这个链接来查看CPU的缓存是如何工作的以及MESI协议)。下面让我们来揭穿三个有关NULL位图的普遍误区。
 
误区 #6a:NULL位图并不是任何时候都会用到
正确
 
    就算表中不存在允许NULL的列,NULL位图对于数据行来说会一直存在(数据行指的是堆或是聚集索引的叶子节点)。但对于索引行来说(所谓的索引行也就是聚集索引和非聚集索引的非叶子节点以及非聚集索引的叶子节点)NULL位图就不是一直有效了。
     下面这条语句可以有效的证明这一点:
<div style="border-bottom: green 1px dashed; border-left: green 2px solid; padding-bottom: 1px; margin-top: 5px; padding-left: 1px; padding-right: 1px; margin-left: 15px; border-top: green 1px dashed; border-right: green 1px dashed; padding-top: 1px; margin-buttom: 5px">   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
页: [1]
查看完整版本: SQL Server误区30日谈-Day6-有关NULL位图的三个误区