西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁西西教程數(shù)據(jù)庫教程 → forwarded record是什么?SQL Server隱性IO性能殺手怎么解決

forwarded record是什么?SQL Server隱性IO性能殺手怎么解決

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:西西整理時(shí)間:2014/7/7 10:01:59字體大小:A-A+

作者:西西點(diǎn)擊:12次評(píng)論:0次標(biāo)簽: SQLServer

最近在一個(gè)客戶那里注意到一個(gè)計(jì)數(shù)器很高(Forwarded Records/Sec),伴隨著間歇性的磁盤等待隊(duì)列的波動(dòng)。本篇文章分享什么是forwarded record,并從原理上談一談為什么Forwarded record會(huì)造成額外的IO。

存放原理

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

圖1.Forwarded Record示意

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

Forwarded Record如何影響IO性能?

    那么Forwarded Record既然是為了提升性能存在的機(jī)制,為什么又會(huì)引起性能問題?Forwarded Record的初衷是為了對(duì)堆表進(jìn)行更新時(shí),堆表上存儲(chǔ)位置的變化不會(huì)同時(shí)更新非聚集索引而產(chǎn)生開銷。但對(duì)于查找來說,無論是堆表上存在表掃描,還是用于書簽查找,都會(huì)成倍帶來額外的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萬條數(shù)據(jù)

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

圖2.堆表空間占用

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

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

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

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

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

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

如何解決

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

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

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

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)