SQL Server 中數據存儲的基本單位是頁。為資料庫中的數據文件(.mdf 或 .ndf)分配的磁碟空間可以從邏輯上劃分成頁(從 0 到 n 連續編號)。磁碟 I/O 操作在頁級執行。也就是說,SQL Server 讀取或寫入所有數據頁。 區是八個物理上連續的頁的集合,用來有效地管理頁。所有頁都 ...
SQL Server 中數據存儲的基本單位是頁。為資料庫中的數據文件(.mdf 或 .ndf)分配的磁碟空間可以從邏輯上劃分成頁(從 0 到 n 連續編號)。磁碟 I/O 操作在頁級執行。也就是說,SQL Server 讀取或寫入所有數據頁。
區是八個物理上連續的頁的集合,用來有效地管理頁。所有頁都存儲在區中。
頁在 SQL Server 中,頁的大小為 8 KB。這意味著 SQL Server 資料庫中每 MB 有 128 頁。每頁的開頭是 96 位元組的標頭,用於存儲有關頁的系統信息。此信息包括頁碼、頁類型、頁的可用空間以及擁有該頁的對象的分配單元 ID。
下表說明瞭 SQL Server 資料庫的數據文件中所使用的頁類型。
頁類型 |
內容 |
---|---|
Data |
當 text in row 設置為 ON 時,包含除 text、 ntext、image、nvarchar(max)、varchar(max)、varbinary(max) 和 xml 數據之外的所有數據的數據行。 |
Index |
索引條目。 |
Text/Image |
大型對象數據類型:
數據行超過 8 KB 時為可變長度數據類型列:
|
Global Allocation Map、Shared Global Allocation Map |
有關區是否分配的信息。 |
Page Free Space |
有關頁分配和頁的可用空間的信息。 |
Index Allocation Map |
有關每個分配單元中表或索引所使用的區的信息。 |
Bulk Changed Map |
有關每個分配單元中自最後一條 BACKUP LOG 語句之後的大容量操作所修改的區的信息。 |
Differential Changed Map |
有關每個分配單元中自最後一條 BACKUP DATABASE 語句之後更改的區的信息。 |
註意 |
---|
日誌文件不包含頁,而是包含一系列日誌記錄。 |
在數據頁上,數據行緊接著標頭按順序放置。頁的末尾是行偏移表,對於頁中的每一行,每個行偏移表都包含一個條目。每個條目記錄對應行的第一個位元組與頁首的距離。行偏移表中的條目的順序與頁中行的順序相反。
大型行支持
行不能跨頁,但是行的部分可以移出行所在的頁,因此行實際可能非常大。頁的單個行中的最大數據量和開銷是 8,060 位元組 (8 KB)。但是,這不包括用 Text/Image 頁類型存儲的數據。包含 varchar、nvarchar、varbinary 或 sql_variant 列的表不受此限制的約束。當表中的所有固定列和可變列的行的總大小超過限制的 8,060 位元組時,SQL Server 將從最大長度的列開始動態將一個或多個可變長度列移動到 ROW_OVERFLOW_DATA 分配單元中的頁。每當插入或更新操作將行的總大小增大到超過限制的 8,060 位元組時,將會執行此操作。將列移動到 ROW_OVERFLOW_DATA 分配單元中的頁後,將在 IN_ROW_DATA 分配單元中的原始頁上維護 24 位元組的指針。如果後續操作減小了行的大小,SQL Server 會動態將列移回到原始數據頁。有關詳細信息,請參閱行溢出數據超過 8 KB。
區區是管理空間的基本單位。一個區是八個物理上連續的頁(即 64 KB)。這意味著 SQL Server 資料庫中每 MB 有 16 個區。
為了使空間分配更有效,SQL Server 不會將所有區分配給包含少量數據的表。SQL Server 有兩種類型的區:
-
統一區,由單個對象所有。區中的所有 8 頁只能由所屬對象使用。
-
混合區,最多可由八個對象共用。區中八頁的每頁可由不同的對象所有。
通常從混合區向新表或索引分配頁。當表或索引增長到 8 頁時,將變成使用統一區進行後續分配。如果對現有表創建索引,並且該表包含的行足以在索引中生成 8 頁,則對該索引的所有分配都使用統一區進行。