1. 程式人生 > >SQL Server 裡的資料行結構

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.

例項

參考資料