SQL Server誤區30日談 第6天 有關NULL位圖的三個誤區。本站提示廣大學習愛好者:(SQL Server誤區30日談 第6天 有關NULL位圖的三個誤區)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server誤區30日談 第6天 有關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 的完成劇本。
讓我們經由過程上面的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 = <<<<<<<
No null bitmap Memory Dump @0x685DC060
誤區 #6b: NULL位圖僅僅被用於可空列
毛病
當NULL位圖存在時,NULL位圖會給記載中的每列對應一名,然則數據庫中最小的單元是字節,所認為了向上取整到字節,NULL位圖的位數能夠會比列數要多。關於這個成績.我曾經有一篇博文對此停止概述,請看:Misconceptions around null bitmap size.
誤區 #6c:給表中添加額定一列時會立刻招致SQL Server對表中數據的修正
毛病
只要向表中新添加的列是帶默許值,且默許值不是NULL時,才會立刻招致SQL Server對數據條目停止修正。總之,SQL Server存儲引擎會記載一個或多個新添加的列並沒有反應在數據記載中。關於這點,我有一篇博文加倍深刻的對此停止了論述:Misconceptions around adding columns to a table.