真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何理解SQLServer中的ForwardedRecord

今天就跟大家聊聊有關(guān)如何理解SQL Server中的Forwarded Record,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

目前成都創(chuàng)新互聯(lián)公司已為數(shù)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、郎溪網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

存放原理

在SQL Server中,當(dāng)數(shù)據(jù)是以堆的形式存放時(shí),數(shù)據(jù)是無(wú)序的,所有非聚集索引的指針存放指向物理地址的RID。當(dāng)數(shù)據(jù)行中的變長(zhǎng)列增長(zhǎng)使得原有頁(yè)無(wú)法容納下數(shù)據(jù)行時(shí),數(shù)據(jù)將會(huì)移動(dòng)到新的頁(yè)中,并在原位置留下一個(gè)指向新頁(yè)的指針,這么做的原因是由于使得當(dāng)出現(xiàn)對(duì)Record的更新時(shí),所有非聚集索引的指針不用變動(dòng)。如圖1所示。

如何理解SQL Server中的Forwarded Record

圖1.Forwarded Record示意

這種由于數(shù)據(jù)更新,只在原有位置留下指針指向新數(shù)據(jù)頁(yè)存放位置行,就是所謂的Forwarded Record。

Forwarded Record如何影響IO性能?

那么Forwarded Record既然是為了提升性能存在的機(jī)制,為什么又會(huì)引起性能問(wèn)題?Forwarded Record的初衷是為了對(duì)堆表進(jìn)行更新時(shí),堆表上存儲(chǔ)位置的變化不會(huì)同時(shí)更新非聚集索引而產(chǎn)生開銷。但對(duì)于查找來(lái)說(shuō),無(wú)論是堆表上存在表掃描,還是用于書簽查找,都會(huì)成倍帶來(lái)額外的IO開銷,下面看一個(gè)例子。

CREATE TABLE dbo.HeapTest ( id INT, col1 VARCHAR(800) )  DECLARE @index INT SET @index = 0 BEGIN TRAN WHILE @index < 100000      BEGIN          INSERT  INTO dbo.HeapTest                 ( id, col1 )         VALUES  ( @index, NULL )         SET @index = @index + 1      END COMMIT

代碼清單1.新建堆表并插入10萬(wàn)條數(shù)據(jù)

通過(guò)代碼清單1創(chuàng)建測(cè)試表,并循環(huán)插入10萬(wàn)數(shù)據(jù)。此時(shí)我們來(lái)看該堆表所占用存儲(chǔ)的頁(yè)數(shù),如圖2所示。

如何理解SQL Server中的Forwarded Record

圖2.堆表空間占用

此時(shí)對(duì)該表進(jìn)行更新,讓原有行增長(zhǎng),產(chǎn)生Forwarded Record,此時(shí)再來(lái)看該堆表的存儲(chǔ)。如圖3所示。

如何理解SQL Server中的Forwarded Record

圖3.產(chǎn)生8W+的forwarded record

此時(shí)我們注意到,雖然數(shù)據(jù)僅僅占到590頁(yè),但存在8W+的forwarded record,如果我們對(duì)該表進(jìn)行掃描,則會(huì)看到雖然僅僅只有590頁(yè),但需要8W+的邏輯IO,大大提升了對(duì)IO的開銷壓力,此外由于forwarded record頁(yè)與原頁(yè)往往不物理連續(xù),因此對(duì)IOPS也存在挑戰(zhàn)。如圖4所示。

如何理解SQL Server中的Forwarded Record

圖4.不該產(chǎn)生的額外IO開銷

而上面查詢反映到性能計(jì)數(shù)器中,則呈現(xiàn)為如圖5所示的結(jié)果。

如何理解SQL Server中的Forwarded Record

圖5.Forwarded Record計(jì)數(shù)器增長(zhǎng)

如何解決

看到Forwarded Record計(jì)數(shù)器,就說(shuō)明數(shù)據(jù)庫(kù)中存在堆表,在OLTP系統(tǒng)中,所有的表上都應(yīng)該有聚集索引。因此可以通過(guò)在表上增加聚集索引來(lái)解決該問(wèn)題。

通常來(lái)講,只有只寫不讀的表設(shè)置為堆表比較合適,但如果看到存在Forwarded Reocord,則說(shuō)明堆表上存在讀操作,那么找到該堆表,找一個(gè)合適的維護(hù)窗口時(shí)間創(chuàng)建堆表則是比較理想的選擇。

如果由于其他原因無(wú)法創(chuàng)建聚集索引,則可以對(duì)堆表進(jìn)行表重建。

看完上述內(nèi)容,你們對(duì)如何理解SQL Server中的Forwarded Record有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


文章題目:如何理解SQLServer中的ForwardedRecord
文章位置:http://weahome.cn/article/ijpgid.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部