SQL Server 中資料存放區的基本單位是頁。為資料庫中的資料檔案(.mdf 或 .ndf)分配的磁碟空間可以從邏輯上劃分成頁(從 0 到 n 連續編號)。磁碟 I/O 操作在頁級執行。也就是說,SQL Server 讀取或寫入所有資料頁。
平時在通過Sql Server Profiler 或者開啟Statistics IO 選項時看到物理讀,邏輯度的單位都是頁。
在 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 |
大型物件資料類型:
- text、 ntext、image、nvarchar(max)、varchar(max)、varbinary(max) 和 xml 資料。
資料行超過 8 KB 時為可變長度資料類型列:
- varchar、nvarchar、varbinary 和 sql_variant
|
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 會動態將列移回到未經處理資料頁。
資料行儲存在頁上,超出頁大小如此。
這樣就很簡單的出來了2個原則:
表設計:Row 要佔用儘可能短的長度,佔用少的空間,讓一個page上儲存更多的row,這樣在相同的讀次數下,擷取到的資料就更多了。
查詢: Select的時候,別動不動就來個*,因為當row 中有Image,text等,或者本身變長欄位vchar等加起來的長度超過了8k,就會需要去
ROW_OVERFLOW_DATA 中去讀取一次。增加了讀的開銷。當然從網路等開銷來說也不建議用 * 。