首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

Forwarded Record:SQL Server 堆疊表隱形的 I/O 效能殺手

     編輯:關於SqlServer

什麼是 Forwarded Record?

堆疊表(無叢集索引)中,可變長度欄位更新導致資料列超出頁面容量時,資料列會移至新頁,原位置留下一個 16 位元組的轉發指標指向新位置(圖 1)。這是為了避免更新所有非叢集索引的 RID 指標。

Forwarded Record 示意

圖 1. Forwarded Record 示意圖

為何會傷害 I/O 效能?

掃描堆疊表或書籤查找時,每遇一個 Forwarded Record 就需額外一次 I/O 讀取新頁。大量更新導致大量轉發指標,I/O 成倍增加。

實測重現

  1. 建立堆疊表插入 10 萬筆 `VARCHAR(800)` 初始為 NULL 的資料(圖 2)。
  2. 初始頁面數

    圖 2. 初始儲存頁面數

  3. 更新欄位使資料列膨脹,產生 8 萬+ Forwarded Record(圖 3)。
  4. 大量 Forwarded Record

    圖 3. 產生 8 萬+ Forwarded Record

此時全表掃描 I/O 暴增。解決方案:重建叢集索引或 `ALTER TABLE ... REBUILD` 消除轉發指標。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved