SQL Server 裡的資料行結構
感覺關於資料庫的 資料行結構
(data row/record structure) 這方面的內容國內的資料特別少,老師上課講到後,怎麼搜也搜不到,最後還是爬梯|=|子才搜到一些的,這裡對老師上課講的和網上看的做一個小總結。
文章目錄
資料行結構
行結構總覽
SQL Server系統 資料型別可以在邏輯上分為兩個不同的組,例如固定長度(fixed-length)和可變長度(variable-length)型別。 固定長度資料型別(如int,datetime,char等)始終使用相同的儲存空間,無論值是什麼,即使它是NULL。 例如,int列始終使用4個位元組,nchar(10)列始終使用20個位元組來儲存資訊。
相反,可變長度資料型別(例如varchar,varbinary和其他一些資料型別)使用盡可能多的儲存空間來儲存資料加上兩個額外位元組。 例如,nvarchar(4000)列將僅使用12個位元組來儲存5個字元的字串,並且在大多數情況下,2個位元組用於儲存NULL值。 我們將討論可變長度列以後不為NULL值使用儲存空間的情況。
該行的前2個位元組(稱為狀態位A(Status Bits A)和狀態位B(Status Bits B))是包含有關該行的資訊的點陣圖,例如行型別是什麼; 該行是否已被邏輯刪除(幽靈(ghosted)); 該行是否具有NULL值,可變長度列和版本控制標記。
行中接下來的兩個位元組用於儲存資料的固定長度(fixed-length)部分的長度。 它們之後是固定長度的資料(fixed-length data)。
在固定長度資料部分之後,存在空點陣圖(null bitmap),其包括兩個不同的資料元素。 第一個2位元組元素是行中的列數(number of columns)。 接下來是空點陣圖陣列(null bitmap array),該陣列使用一位來表示表中的每一列,無論它是否可為空。
ps. 原文中的 它 有點不明白代指什麼。因為使用一位來表示一列,所以共有 Ceiling(#cols / 8)
個位元組
即使表沒有可空列,空點陣圖也始終存在於堆表或聚簇索引葉行的資料行中。但是,當索引中沒有可為空的列時,非頁索引行中的空點陣圖不存在,也不存在非聚簇索引的葉級行。
在空點陣圖之後,是該行的可變長度資料(variable-length data)部分。 它從行中的兩個位元組數量的可變長度列(variable-length columns)開始,後跟可變長度列偏移陣列(variable-length column offset array)。 即使值為空,SQL Server 也會為每行中的每個可變長度列儲存兩個位元組的偏移值。它後跟資料的實際可變長度部分。(它 指 可變長度列偏移陣列)
最後,在行的末尾有可選的14位元組版本控制標記。 該標記在操作期間使用,這需要行版本控制,例如聯機索引重建,樂觀隔離級別等。
行結構補充
至於 Status Bits A 的 8位 有更具體的定義:
位 | 含義 |
---|---|
Bit 0 | Versioning information. In SQL server 2008 this is always 0 |
Bits 1 to 3 | This is three bit value define the record type. |
0 data record. | |
1 Forwarded record. (轉向記錄) | |
2 a forwarding stub. (轉向存根) | |
3 Index record. | |
4 blob fragment or row overflow data. | |
5 ghost index record. (幽靈索引記錄) | |
6 ghost data record (幽靈資料記錄) | |
7 ghost version record | |
Bit 4 | Null bitmap exists or not.In SQL server 2008 null bitmap exists even if there is no null able columns |
Bit 5 | Indicate variable column exists or not. |
Bit 6 | Indicate that row contain versioning information |
Bit 7 | Not used in SQL server |
對於 Status Bits B :
Only one bit is used in this to indicate that the record is ghost forwarded record.