在 SQL Server 中重建索引不会减少碎片

Fpo*_*env 5 index sql-server

我正在尝试减少索引的碎片化。

首先,我重建了所有碎片高于 30% 的索引,但我的大多数索引仍然具有高碎片或什至没有改变 1%。

深入观察,当我减少重建语句的填充因子时,也会减少碎片。

现在,最好的选择是什么?

具有高填充因子的更高碎片或降低填充因子然后获得更低的碎片?

暂时谢谢。

KAS*_*DBA 5

从这个连接项目索引重建不影响碎片

对于小表,通常对碎片的性能影响是不可察觉的。前 8 页分配将来自混合区,混合区可以位于数据库文件中的任何位置。重建索引不会改变这种性质。

如果你有一个小表,那些混合的页面在碎片计算时权重很大;因此,重建索引可能不会减少碎片。(事实上​​,我可以很容易地构建一个重建后碎片增加的情况。)这些碎片不会对您的查询性能造成痛苦;所以基本上你可以输入它们。

当索引的页数达到一定的大大小(例如,1000 页)时,碎片可能会开始影响性能。重建索引应该减少碎片。

因此,可能的原因是重建不会降低碎片值,因为重建后分配给索引的页面来自Mixed extent

此外,@Shanky 写了一篇很棒的文章,其中深入分析了在什么可能导致索引在重建后仍然碎片化的测试场景中展示了这种行为


小智 0

这是一个简单的例子:

\n\n
USE [AdventureWorks]\nGO\n\nALTERINDEX [PK_Product_ProductID] ON [Production].[Product]\nREBUILDPARTITION=ALLWITH (FILLFACTOR= 90)\nGO\n
Run Code Online (Sandbox Code Playgroud)\n\n

填充因子的最佳值

\n\n
    \n
  1. 静态表 \xe2\x80\x93 将填充因子设置为 100(或默认服务器填充因子)

  2. \n
  3. 表更新频率较低 \xe2\x80\x93 将填充因子设置为 95。

  4. \n
  5. 经常更新的表 \xe2\x80\x93 将填充因子设置在 70 到 90 之间。

  6. \n
  7. 标识列 \xe2\x80\x93 上具有聚集索引的表将填充因子设置为 100。

  8. \n
\n\n

如果填充因子是100,我通常说对于频繁更新的表需要降低填充因子。我通常说,如果填充因子低于 100,则需要将标识列和主表设置为 100。

\n