为啥我的索引变得碎片化?

Posted

技术标签:

【中文标题】为啥我的索引变得碎片化?【英文标题】:Why is my index getting fragmented?为什么我的索引变得碎片化? 【发布时间】:2009-08-12 14:36:25 【问题描述】:

我有一个简单的小表(只有 8 个字段),一小时前我重建了表上的一个索引,将其重置为 0% 碎片,但现在高达 38%。

表本身有 400k 条记录,但自从我重建索引以来只插入了 158 条新记录,记录没有更新,但可能有几次删除。

为什么索引会变得如此碎片化?

索引是非唯一的,非聚集在一个字段上。

数据库在 SQL Server 2005 上运行,但兼容级别为 SQL Server 2000。

谢谢

【问题讨论】:

【参考方案1】:

在重建时检查该索引的填充因子。填充因子可能太高。如果是这种情况,在重新构建索引时索引页面将太满,并且添加新行很快就会开始导致页面拆分(碎片)。减少重建时的填充因子将允许在开始发生页面拆分之前将更多新记录插入到索引页面中。

http://msdn.microsoft.com/en-us/library/aa933139%28SQL.80%29.aspx

【讨论】:

感谢您的回答。当我重建索引时,我将填充因子设置为零,这就是它在 sys.indexes 中设置的值?!? 不要使用 0 的填充因子。我认为默认值通常是 80 或类似的东西......不确定。您可以将其设置为 50 或 60...?【参考方案2】:

填充系数 0 等于 100,因此您不允许任何插入空间。如果要插入,则应选择较低的填充因子。

【讨论】:

减少填充因子会在页面中的索引行之间放置空间,但是新的表行会导致新的索引行进入这些间隙或添加到末尾吗? 它填补了空白。如果填充因子为 100,则页面已完全填充,并且没有空间用于新插入的行。因此,这些行会被放到新页面上(也就是分页)。

以上是关于为啥我的索引变得碎片化?的主要内容,如果未能解决你的问题,请参考以下文章

长期接受碎片化信息,会有什么后果?

表空间碎片化一二

APC 碎片化

使用 .NET 时如何限制文件碎片?

信息爆炸下, 让碎片化阅读从未如此高效简单,一键整理碎片化知识

在不添加/删除聚集索引的情况下减少 SQL Server 表碎片?