SQL Server內幕之數據行的結構

表的數據行具備圖6-5 所示的通常結構 (只要數據以未壓縮的形式存儲)。此格式稱爲 FixedVar 格式, 由於全部固定長度列的數據首先存儲, 後跟全部可變長度列的數據。表6-7 顯示了存儲在每一個 FixedVar 行中的信息。數組

blob.png


blob.png

狀態位 A 包含指示行屬性的位圖。這些位具備如下含義:ide


Bit 0 表示特殊的版本控制信息。在 SQL server 2012 中, 這始終是0。版本控制

Bits 1到3做爲3位值, server

0 (000) 表示主記錄, blog

1 (001) 表示轉發的記錄, 索引

2 (010) 表示轉發存根, it

3 (011) 指示一個索引記錄, class

4 (100) 指示一個 BLOB 片斷或行溢出數據, 方法

5 (101) 表示虛影索引記錄, im

6 (110) 表示虛影數據記錄, 

7 (111) 表示虛影版本記錄。


Bit 4 表示存在空位圖。在 SQL server 2012 中, 即便在任何列中都不容許有 null, 

也始終存在空位圖。


Bit 5 表示行中存在可變長度列。


Bit 6 表示該行包含版本控制信息。


Bit 7 在 SQL server 2012 中不使用。



狀態位 B 字段中使用的惟一位表示該記錄是虛影轉發的記錄。



您能夠在圖6-5 和表6-7 中看到第三個和第四個字節指示行的固定長度部分的長度。如圖6-5 所示, 它的長度不包括2個字節的列數和空位圖, 這取決於表中列的總數, 這是可變長度。解釋這些位中數據的另外一種方法是, 在該行中能夠找到列數的位置。例如, 若是第三個和第四個字節 (字節 2–3) 包含值 0x0016 (即十進制 22), 則表示該行不只在列數的值以前有22個字節, 並且還意味着能夠在字節22中找到列數的值。



在每一個固定長度或可變長度數據塊中, 數據以建立表的列順序存儲。例如, 假設使用如下命令建立了一個表:


CREATE TABLE Test1

(

Col1 int NOT NULL,

Col2 char(25) NOT NULL,

Col3 varchar(60) NULL,

Col4 money NOT NULL,

Col5 varchar(20) NOT NULL

);


此行的固定長度數據部分包含 Col1 的數據, 後跟 Col2 的數據, 後跟 Col4 的數據。可變長度數據部分包含 Col3 的數據, 後跟 Col5 的數據。對於僅包含固定長度數據的行, 如下值爲 true。


數據行第一個字節的第一個十六進制數字爲 1, 表示不存在可變長度列。(第一個十六進制數字包括位4到 7; bits 6 和7老是 0, 若是不存在變長列, 則位5也是0。位4始終爲 1, 所以四位的值顯示爲1。


數據行結束於空位圖以後, 它遵循固定長度的數據 (即, 圖6-5 中顯示的陰影部分不會存在於只有固定長度數據的行中)。


每一個數據行的總長度是相同的。



具備任何可變長度列的數據行有一個列偏移量數組, 每一個非 NULL 可變長度列都有一個2字節的條目, 指示列在其中結束的行中的位置。(術語偏移和位置不是徹底可互換的。偏移量是基於0的, 而位置是基於1的。偏移量爲7的字節位於行中的第八字節位置。)存儲具備 NULL 值的可變長度列涉及一些特殊問題, 如後面的 "null 和可變長度列" 部分所討論的。

相關文章
相關標籤/搜索