從物理結構上談一談SQL Server數據庫的優化
我們知道,SQL Server中數據存儲的基本單位是頁。為數據庫中的數據文件(.mdf 或 .ndf)分配的磁盤空間可以從邏輯上劃分成頁(從 0 到 n 連續編號)。磁盤 I/O 操作在頁級執行。也就是說,SQL Server 讀取或寫入所有數據頁。
平時在通過SQL Server Profiler 或者打開Statistics IO 選項時看到物理讀,邏輯度的單位都是頁。
在SQL Server 中,頁的大小為8KB。這意味著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 語句之后更改的區的信息。 |
在數據頁上,數據行緊接著標頭按順序放置。頁的末尾是行偏移表,對于頁中的每一行,每個行偏移表都包含一個條目。每個條目記錄對應行的***個字節與頁首的距離。行偏移表中的條目的順序與頁中行的順序相反。
數據行存儲在頁上,超出頁大小如此。
2個原則:
表設計:Row 要占用盡可能短的長度,占用少的空間,讓一個page上存儲更多的row,這樣在相同的讀次數下,獲取到的數據就更多了。
查詢:Select的時候,別動不動就來個*,因為當row 中有Image,text等,或者本身變長字段vchar等加起來的長度超過了8k,就會需要去
ROW_OVERFLOW_DATA 中去讀取一次。增加了讀的開銷。當然從網絡等開銷來說也不建議用* 。
關于SQL Server數據庫從存儲頁方面的優化措施就介紹到這里了,希望本次的介紹能夠對您有所收獲!
【編輯推薦】