对SQL索引进行碎片整理

时间:2009-11-05 13:58:25

标签: sql-server-2005 defragmentation

我一直在尝试在SQL Server 2005中对索引进行碎片整理,似乎没有任何工作。我使用向导创建了多个维护计划,但作业始终失败。我从这个站点运行脚本,该站点最初来自Microsoft:

http://blog.sqlauthority.com/2008/03/04/sql-server-2005-a-simple-way-to-defragment-all-indexes-in-a-database-that-is-fragmented-above-a-declared-threshold/

即使我转到对象资源管理器中的特定表并选择了Indexes文件夹并选择Rebuild All,碎片%永远不会改变,即使它报告为成功完成。

重建的索引不应该有0%的碎片吗?如果是这样,为什么这个sql不起作用:

ALTER INDEX [IndexName] ON [dbo].[TableName] 
REBUILD WITH ( PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = Off,
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, SORT_IN_TEMPDB = OFF, ONLINE = OFF )

这是由选定的重建索引生成的SQL。

2 个答案:

答案 0 :(得分:0)

如果表中没有很多行,或者数据没有消耗一页数据(8k),即使重建后你也会注意到索引碎片。

答案 1 :(得分:0)

虽然可能与其他回复中建议的非常小的数据库有关,但问题更多可能与FILLFACTOR 有关。

显示的ALTER INDEX语句没有显式提及FILLFACTOR,因此重建是在当前fillfactor值的基础上完成的,留下应该接近此因子的碎片。 (它很少是完全匹配,因为给定的索引条目不能在两个节点之间分割,因此使得每个节点可能留下比fillfactor所需的更多或更少的空间;实际上在某些情况下,这将需要一小部分字节数。但是,我们不要偏离真正的问题......)

您可以通过查看sys.indexes表查询给定索引的当前fillfactor值,查询类似于 SELECT * FROM sys.indexes WHERE object_id IN   (SELECT object_id FROM sys.objects     WHERE name ='myTableName')

或者,如果您运行修改后的ALTER INDEX修剪版本,则显示在哪里 ...... FILLFACTOR = 100 ...... 在“WITH”选项中添加,我怀疑报告的碎片符合您的预期。

为了清楚起见,PAD_INDEX选项仅指示SQL在索引的中间节点中留下一些空间,因此这些空间不会产生任何“碎片”,但叶节点将会出现。

这说...... 可能留下一定数量的fillfactor ,以便在插入新数据时延迟碎片的开始桌子。