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






