SQL Server誤區(qū)30日談 第6天 有關(guān)NULL位圖的三個(gè)誤區(qū)
誤區(qū) #6a:NULL位圖并不是任何時(shí)候都會(huì)用到
正確
就算表中不存在允許NULL的列,NULL位圖對(duì)于數(shù)據(jù)行來(lái)說(shuō)會(huì)一直存在(數(shù)據(jù)行指的是堆或是聚集索引的葉子節(jié)點(diǎn))。但對(duì)于索引行來(lái)說(shuō)(所謂的索引行也就是聚集索引和非聚集索引的非葉子節(jié)點(diǎn)以及非聚集索引的葉子節(jié)點(diǎn))NULL位圖就不是一直有效了。
下面這條語(yǔ)句可以有效的證明這一點(diǎn):
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
你可以通過(guò)我的博文:Inside The Storage Engine: sp_AllocationMetadata - putting undocumented system catalog views to work.來(lái)獲得sp_allocationMetadata 的實(shí)現(xiàn)腳本。
讓我們通過(guò)下面的script來(lái)分別查看在堆上的頁(yè)和非聚集索引上的頁(yè):
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
首先讓我們來(lái)看堆上這頁(yè)Dump出來(lái)的結(jié)果
Slot 0 Offset 0x60 Length 11
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Memory Dump
@0x685DC060
再來(lái)看非聚集索引上的一頁(yè)Dump出來(lái)的結(jié)果:
Slot 0, Offset 0x60, Length 13, DumpStyle BYTE
Record Type = INDEX_RECORD Record Attributes = <<<<<<<
No null bitmap Memory Dump @0x685DC060
誤區(qū) #6b: NULL位圖僅僅被用于可空列
錯(cuò)誤
當(dāng)NULL位圖存在時(shí),NULL位圖會(huì)給記錄中的每一列對(duì)應(yīng)一位,但是數(shù)據(jù)庫(kù)中最小的單位是字節(jié),所以為了向上取整到字節(jié),NULL位圖的位數(shù)可能會(huì)比列數(shù)要多。對(duì)于這個(gè)問(wèn)題.我已經(jīng)有一篇博文對(duì)此進(jìn)行概述,請(qǐng)看:Misconceptions around null bitmap size.
誤區(qū) #6c:給表中添加額外一列時(shí)會(huì)立即導(dǎo)致SQL Server對(duì)表中數(shù)據(jù)的修改
錯(cuò)誤
只有向表中新添加的列是帶默認(rèn)值,且默認(rèn)值不是NULL時(shí),才會(huì)立即導(dǎo)致SQL Server對(duì)數(shù)據(jù)條目進(jìn)行修改??傊?,SQL Server存儲(chǔ)引擎會(huì)記錄一個(gè)或多個(gè)新添加的列并沒有反映在數(shù)據(jù)記錄中。關(guān)于這點(diǎn),我有一篇博文更加深入的對(duì)此進(jìn)行了闡述:Misconceptions around adding columns to a table.
相關(guān)文章
使用sqlplus創(chuàng)建DDL和DML操作方法
這篇文章主要介紹了使用sqlplus創(chuàng)建DDL和DML操作方法,需要的朋友可以參考下2018-04-04淺談基于SQL Server分頁(yè)存儲(chǔ)過(guò)程五種方法及性能比較
本文由腳本之家小編給大家分享了五種sqlserver分頁(yè)存儲(chǔ)過(guò)程及性能比較,接下來(lái)我們跟著小編一起了解了解吧2015-09-09SQL Server雙服務(wù)器架設(shè)并數(shù)據(jù)自動(dòng)同步教程
自編程序由單機(jī)版改為網(wǎng)絡(luò)版后,使用范圍迅速擴(kuò)大,如何保障數(shù)據(jù)庫(kù)萬(wàn)無(wú)一失成為一個(gè)重要解決的問(wèn)題于是想到架設(shè)雙服務(wù)器并數(shù)據(jù)自動(dòng)同步,詳細(xì)步驟如下2012-11-11MSSQL中進(jìn)行SQL除法運(yùn)算結(jié)果為小數(shù)卻顯示0的解決方法
這篇文章主要介紹了MSSQL中進(jìn)行SQL除法運(yùn)算結(jié)果為小數(shù)卻顯示0的解決方法,需要的朋友可以參考下2015-10-10Linux環(huán)境中使用BIEE 連接SQLServer業(yè)務(wù)數(shù)據(jù)源
biee11g默認(rèn)安裝了mssqlserver的數(shù)據(jù)驅(qū)動(dòng),不需要在服務(wù)器端進(jìn)行重新安裝,配置過(guò)程主要基于ODBC實(shí)現(xiàn),本文主要介紹客戶端為windows、服務(wù)端為linux系統(tǒng)的配置過(guò)程。2014-07-07實(shí)例講解sql server排名函數(shù)DENSE_RANK的用法
這篇文章主要以一個(gè)實(shí)例講解了sql server排名函數(shù)DENSE_RANK的用法,感興趣的小伙伴們可以參考一下2016-03-03SQLSERVER啟動(dòng)不起來(lái)(錯(cuò)誤9003)的解決方法分享
這篇文章主要介紹了SQLSERVER因錯(cuò)誤9003啟動(dòng)不起來(lái)的解決方法,大家參考使用吧2013-11-11SQL Server阻止保存修改表結(jié)構(gòu)的解決方法
修改DeUser表中列的數(shù)據(jù)類型從varchar修改為int時(shí),進(jìn)行保存時(shí)彈出的提示框,阻止保存修改表結(jié)構(gòu),怎么辦?這篇文章就為大家詳細(xì)介紹了解決SQL Server阻止保存修改表結(jié)構(gòu)問(wèn)題的方法,感興趣的小伙伴們可以參考一下2016-05-05SQL SERVER數(shù)據(jù)庫(kù)表記錄只保留N天圖文教程
本篇向大家介紹SQL Server 2008 R2數(shù)據(jù)庫(kù)中數(shù)據(jù)表保留10天記錄,需要的朋友可以參考下2015-09-09