堆中转发的提取 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 亿
我有一个 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 亿