4

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

sp_blitzindex从 Brent Ozar 跑来诊断当前的性能问题。

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

谁能解释一下这是怎么可能的?我不是在寻找任何设计考虑因素,只是对它如何工作的解释。非常感谢!问候, SQL_M。

4

1 回答 1

4

逻辑碎片。

曾几何时:在同一页上,第 1 行在第 2 行旁边,在第 3 行旁边等等。这将在初始插入时发生。

随着时间的推移,第 2 行得到了更新(假设 varchar 列的存储字符数增加了一倍)。第 2 行将被移动到一个新页面,以避免将 39,999,998 行“向下移动一点”。

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

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

我转述了布伦特

于 2017-03-02T12:42:27.420 回答