堆中转发的提取 table

Forwarded fetches in heap table

我有一个 table 大约有 4000 万行。这个 table 是一个堆,有几个非聚集索引。我一直认为 1 行只能有一个前向获取。

我 运行 sp_blitzindex 来自 Brent Ozar 来诊断当前的性能问题。

根据 sp_blitzindex,该堆有超过 50 亿次转发提取 (...)。

谁能解释一下这是怎么可能的?我不是在寻找任何设计考虑因素,只是对其工作原理的解释。非常感谢!此致,SQL_M.

逻辑碎片。

曾几何时:在同一页上,第 1 行紧挨着第 2 行,紧挨着第 3 行等。 这会在初始插入时发生。

随着时间的推移,第 2 行得到了更新(假设 varchar 列的存储字符数增加了一倍)。第 2 行将被移动到新页面以避免移动 39,999,998 行 "down a bit".

为了解决这个问题,创建了从第 1 行到第 2 行新位置的指针,然后返回到第 3 行。

在没有聚集索引的情况下重复超过 4000 万行,这意味着无法对磁盘中的数据进行碎片整理,您很容易达到 50 亿

I para-phrased Brent