【譯】SQL Server誤區30日談-Day6-有關NULL點陣圖的三個誤區
本系列文章是我在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點陣圖就不是一直有效了。
下面這條語句可以有效的證明這一點:
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.
分類: SQL Server DBA誤區
本文轉自CareySon部落格園部落格,原文連結http://www.cnblogs.com/CareySon/archive/2012/10/24/2736576.html,如需轉載請自行聯絡原作者
相關文章
- SQL Server有關鎖升級的誤區說明SQLServer
- SQL Server關於AlwaysOn的理解-讀寫分離的誤區(一)SQLServer
- SOCKS代理的三個誤區
- SQL Server誤區30日談-Day16-資料的損壞和修復SQLServer
- 關於日本地域的兩點誤區
- 關於SQL開發規範中的那些誤區!SQL
- SQL Server誤區 一個例項多個映象和日誌傳送延遲SQLServer
- 談談資料安全常見的誤區
- 使用Cassandra時需要避免的三個誤區WH
- 【譯】使用 Android Architecture Components 的五個常見誤區Android
- 中科三方:關於SSL證書的幾個常見誤區
- 【熱點】數字化轉型最致命的4個誤區和3個錯誤
- Promise 的誤區Promise
- 企業實施ERP有哪些難點和誤區
- 大資料分析的誤區有哪些大資料
- 使用代理IP常見的三大誤區
- 資料治理常見的誤區有哪些
- 關於資料抓取很多新人的誤區
- 關於威脅者和密碼安全的3個誤區密碼
- 谷歌平臺工程五個誤區谷歌
- 常見資料分析誤區有哪些?
- 自學Java開發有哪些誤區?Java
- 企業CRM選型有哪些誤區?
- 布萊恩·約翰遜長壽抗衰的三個誤區
- 共享主機經常遇到的誤區有哪些?
- 淺談 記一次 import 打包 印象誤區Import
- 微服務轉型的三大誤區,避坑指南→微服務
- sql server中的一個坑-len與datalength區別SQLServer
- SQL Server DACPAC資料庫部署錯誤SQLServer資料庫
- 自學程式設計的 6 個致命誤區程式設計
- 技術人溝通中的幾個誤區
- DevOps實踐中,遇到的常見誤區有哪些?dev
- 效能測試的理解誤區
- SOCKS代理的常見誤區
- Flutter 中 GestureDetector 的使用誤區Flutter
- 分解質因數的誤區
- 淺談域名和伺服器集約化管理的誤區伺服器
- 軟體測試之冒煙測試中易犯的三個誤區
- Java新手會遇到的三大誤區,一定要避免!Java