如何为每个片段设置 SQL Server 索引页?

Sug*_*rue 7 index sql-server-2008 sql-server fragmentation

我有 SQL Server 2008 和一些数据库。我发现我的表的一个索引非常零碎(我怎么知道:http : //msdn.microsoft.com/en-us/library/ms189858.aspx

avg_fragmentation_in_percent是高达97%以上,且片段计数是数千。非常有趣的avg_fragment_size_in_pages是,它只是略大于 1。我可以对其进行碎片整理,这有帮助,但我想首先防止这种情况发生。

为什么每个片段的页数如此之低?我有FILEGROWTH = 128MB整个数据库,但是这个特定的表是最活跃的 - 那么有没有办法告诉 SQL Server 为这个表或索引分配更多的增长,以便每个片段的页数更高?

Rem*_*anu 15

首先,您应该评估碎片化的影响。很多时候,碎片化被描绘成所有服务器问题的最终邪恶原因,而没有考虑其实际影响。碎片化会影响几个方面:

  • 由于影响预读效率和小 IO 大小(页面与范围)而减慢扫描速度
  • 由于频繁拆分,每页行数较低,因此 IO 效率较低
  • 由于与上述相同,较低的缓冲池缓存命中率(即较低的页面预期寿命)
  • 由于频繁拆分,INSERT 的成本影响更大

以上都是不好的,但这是真正的交易:如果不存在上述任何症状,您可能会有 97% 的碎片化。高碎片确实会导致所有这些问题,但前提是您的特定工作负载实际上以导致这些症状出现的方式与碎片交互。

我建议使用等待和队列方法来定位您的实际性能瓶颈并适当地评估它们。您可能会很好地确认碎片具有严重的影响,并且需要更改架构和可能的应用程序来解决问题,但是您可能会发现问题出在其他地方并且解决方案完全不同。

最后:您可能还会发现花费 5000 美元购买更多 RAM 和一些好的 SSD 可以完全缓解您遇到的问题。在您对这样的补救措施(什么,没有解决根本原因?诅咒!)感到恐惧之前,请考虑与应用程序更改相关的风险和成本......

  • 我敢于冒险的任何答案都是猜测。尝试等待和队列。收集性能计数器。措施。 (4认同)
  • 没有办法碎片*导致*。30 秒将来自文件增长或锁定冲突(可能由扫描引起)之类的事情。我将专注于了解发生这些超时时会发生什么。 (3认同)