Forwarded record:SQL Server中一個隱性的IO效能殺手

來源:互聯網
上載者:User

簡介

最近在一個客戶那裡注意到一個計數器很高(Forwarded Records/Sec),伴隨著間歇性的磁碟等待隊列的波動。本篇文章分享什麼是forwarded record,並從原理上談一談為什麼Forwarded record會造成額外的IO。

存放原理

在SQL Server中,當資料是以堆的形式存放時,資料是無序的,所有非叢集索引的指標存放指向物理地址的RID。當資料行中的變長列增長使得原有頁無法容納下資料行時,資料將會移動到新的頁中,並在原位置留下一個指向新頁的指標,這麼做的原因是由於使得當出現對Record的更新時,所有非叢集索引的指標不用變動。如圖1所示。

圖1.Forwarded Record示意

這種由於資料更新,只在原有位置留下指標指向新資料頁存放位置行,就是所謂的Forwarded Record。

更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/database/SQLServer/

Forwarded Record如何影響IO效能?

那麼Forwarded Record既然是為了提升效能存在的機制,為什麼又會引起效能問題?Forwarded Record的初衷是為了對堆表進行更新時,堆表上儲存位置的變化不會同時更新非叢集索引而產生開銷。但對於尋找來說,無論是堆表上存在表掃描,還是用於書籤尋找,都會成倍帶來額外的IO開銷,下面看一個例子。

CREATETABLEdbo.HeapTest ( id INT, col1 VARCHAR(800) )    DECLARE@indexINTSET@index= 0BEGINTRANWHILE @index< 100000     BEGIN        INSERT  INTOdbo.HeapTest                ( id, col1 )        VALUES  ( @index, NULL)        SET@index= @index+ 1

代碼清單1.建立堆表並插入10萬條資料

通過代碼清單1建立測試表,並迴圈插入10萬資料。此時我們來看該堆表所佔用儲存的頁數,如圖2所示。

圖2.堆資料表空間佔用

此時對該表進行更新,讓原有行增長,產生Forwarded Record,此時再來看該堆表的儲存。如圖3所示。

圖3.產生8W+的forwarded record

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.