從物理結(jié)構(gòu)上談一談SQL Server數(shù)據(jù)庫的優(yōu)化
我們知道,SQL Server中數(shù)據(jù)存儲的基本單位是頁。為數(shù)據(jù)庫中的數(shù)據(jù)文件(.mdf 或 .ndf)分配的磁盤空間可以從邏輯上劃分成頁(從 0 到 n 連續(xù)編號)。磁盤 I/O 操作在頁級執(zhí)行。也就是說,SQL Server 讀取或?qū)懭胨袛?shù)據(jù)頁。
平時在通過SQL Server Profiler 或者打開Statistics IO 選項時看到物理讀,邏輯度的單位都是頁。
在SQL Server 中,頁的大小為8KB。這意味著SQL Server數(shù)據(jù)庫中每MB有128 頁。每頁的開頭是96 字節(jié)的標頭,用于存儲有關(guān)頁的系統(tǒng)信息。此信息包括頁碼、頁類型、頁的可用空間以及擁有該頁的對象的分配單元 ID。
下表說明了SQL Server 數(shù)據(jù)庫的數(shù)據(jù)文件中所使用的頁類型。
頁類型 | 內(nèi)容 |
---|---|
Data |
當 text in row 設(shè)置為 ON 時,包含除 text、 ntext、image、nvarchar(max)、varchar(max)、varbinary(max) 和 xml 數(shù)據(jù)之外的所有數(shù)據(jù)的數(shù)據(jù)行。 |
Index |
索引條目。 |
Text/Image |
大型對象數(shù)據(jù)類型:
數(shù)據(jù)行超過 8 KB 時為可變長度數(shù)據(jù)類型列:
|
Global Allocation Map、Shared Global Allocation Map |
有關(guān)區(qū)是否分配的信息。 |
Page Free Space |
有關(guān)頁分配和頁的可用空間的信息。 |
Index Allocation Map |
有關(guān)每個分配單元中表或索引所使用的區(qū)的信息。 |
Bulk Changed Map |
有關(guān)每個分配單元中自***一條 BACKUP LOG 語句之后的大容量操作所修改的區(qū)的信息。 |
Differential Changed Map |
有關(guān)每個分配單元中自***一條 BACKUP DATABASE 語句之后更改的區(qū)的信息。 |
在數(shù)據(jù)頁上,數(shù)據(jù)行緊接著標頭按順序放置。頁的末尾是行偏移表,對于頁中的每一行,每個行偏移表都包含一個條目。每個條目記錄對應(yīng)行的***個字節(jié)與頁首的距離。行偏移表中的條目的順序與頁中行的順序相反。
數(shù)據(jù)行存儲在頁上,超出頁大小如此。
2個原則:
表設(shè)計:Row 要占用盡可能短的長度,占用少的空間,讓一個page上存儲更多的row,這樣在相同的讀次數(shù)下,獲取到的數(shù)據(jù)就更多了。
查詢:Select的時候,別動不動就來個*,因為當row 中有Image,text等,或者本身變長字段vchar等加起來的長度超過了8k,就會需要去
ROW_OVERFLOW_DATA 中去讀取一次。增加了讀的開銷。當然從網(wǎng)絡(luò)等開銷來說也不建議用* 。
關(guān)于SQL Server數(shù)據(jù)庫從存儲頁方面的優(yōu)化措施就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】






