SQL Server中的IO效能殺手Forwarded record
最近在一個客戶那裡注意到一個計數器很高(Forwarded Records/Sec),伴隨著間歇性的磁碟等待佇列的波動。本篇文章分享什麼是forwarded record,並從原理上談一談為什麼Forwarded record會造成額外的IO。
存放原理
在SQL Server中,當資料是以堆的形式存放時,資料是無序的,所有非聚集索引的指標存放指向實體地址的RID。當資料行中的變長列增長使得原有頁無法容納下資料行時,資料將會移動到新的頁中,並在原位置留下一個指向新頁的指標,這麼做的原因是由於使得當出現對Record的更新時,所有非聚集索引的指標不用變動。如圖1所示。
這種由於資料更新,只在原有位置留下指標指向新資料頁存放位置行,就是所謂的Forwarded Record。
Forwarded Record如何影響IO效能?
那麼Forwarded Record既然是為了提升效能存在的機制,為什麼又會引起效能問題?Forwarded Record的初衷是為了對堆表進行更新時,堆表上儲存位置的變化不會同時更新非聚集索引而產生開銷。但對於查詢來說,無論是堆表上存在表掃描,還是用於書籤查詢,都會成倍帶來額外的IO開銷,下面看一個例子。
CREATE TABLE dbo.HeapTest ( id INT, col1 VARCHAR(800) ) DECLARE @index INT SET @index = 0 BEGIN TRAN WHILE @index
透過程式碼清單1建立測試表,並迴圈插入10萬資料。此時我們來看該堆表所佔用儲存的頁數,如圖2所示。
此時對該表進行更新,讓原有行增長,產生Forwarded Record,此時再來看該堆表的儲存。如圖3所示。
此時我們注意到,雖然資料僅僅佔到590頁,但存在8W+的forwarded record,如果我們對該表進行掃描,則會看到雖然僅僅只有590頁,但需要8W+的邏輯IO,大大提升了對IO的開銷壓力,此外由於forwarded record頁與原頁往往不物理連續,因此對IOPS也存在挑戰。如圖4所示。
而上面查詢反映到效能計數器中,則呈現為如圖5所示的結果。
如何解決
看到Forwarded Record計數器,就說明資料庫中存在堆表,在OLTP系統中,所有的表上都應該有聚集索引。因此可以透過在表上增加聚集索引來解決該問題。
通常來講,只有只寫不讀的表設定為堆表比較合適,但如果看到存在Forwarded Reocord,則說明堆表上存在讀操作,那麼找到該堆表,找一個合適的維護視窗時間建立聚集索引則是比較理想的選擇。
如果由於其他原因無法建立聚集索引,則可以對堆表進行表重建。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4369/viewspace-2800960/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL SERVER--系統隱形殺手—阻塞與等待SQLServer
- SQL Server 2008中Analysis Services的新特性——深入SQL Server 2008SQLServer
- SQL Server 2005效能調整一(zt)SQLServer
- SQL Server 2005效能調整二(zt)SQLServer
- SQL Server 中的 ACID 屬性SQLServer
- IO Interactive 與《殺手》系列的未來走向將會如何?
- 《殺手》官方IO Interactive新作:《Project 007》正式釋出Project
- 如何改善SQL Server + SharePoint組合效能BGSQLServer
- SQL Server 中的一些概念SQLServer
- SQL Server中的版本號如何理解SQLServer
- SQL Server中GROUP BY(連結)SQLServer
- .sql檔案匯入到sql server中SQLServer
- SQL Server中事務日誌自動增長對效能的影響(下)PGSQLServer
- SQL Server中事務日誌自動增長對效能的影響(上)OSSQLServer
- SQL Server中的日期和時間:DATEADD()SQLServer
- 淺談SQL Server中的快照問題SQLServer
- SQL Server郵件相關SQL語句出現嚴重的ASYNC_NETWORK_IO等待事件案例SQLServer事件
- SQL Server 2012 RTM 安裝手記XGSQLServer
- Erlang中的Record詳解
- SQL Server 2016升級遷移過程中效能問題解決案例SQLServer
- sql server中巢狀事務*SQLServer巢狀
- SQL Server 資料庫 最佳化 效能瓶頸SQLServer資料庫
- SQL Server中使用Check約束達到提升效能SQLServer
- SQL SERVER資料庫datediff函式引發的效能問題SQLServer資料庫函式
- SQL Server中提前找到隱式轉換提升效能的辦法SQLServer
- sql serverSQLServer
- 【IO】IO系統效能之一:衡量效能的幾個指標指標
- SQL Server 2008中的行壓縮(上)JUSQLServer
- SQL Server中存在真正的“事務巢狀”SQLServer巢狀
- SQL Server中count(*)和Count(1)的區別SQLServer
- SQL Server中的高可用性概覽SQLServer
- SQL 獲取SQL Server中兩個日期之間的所有日期SQLServer
- SQL Server 的死鎖SQLServer
- 在Oracle SQL中設定每週的起始日期IOOracleSQL
- 從實際案例中探討io中的延遲效能的作用
- SQL Server中Table字典資料的查詢SQL示例程式碼SQLServer
- SQL Server 中的 NOLOCK 到底是什麼意思?SQLServer
- SQL Server中的集合運算: UNION, EXCEPT和INTERSECTSQLServer