我一直在尝试在SQL Server 2005中对索引进行碎片整理,似乎没有任何工作。我使用向导创建了多个维护计划,但作业始终失败。我从这个站点运行脚本,该站点最初来自Microsoft:
即使我转到对象资源管理器中的特定表并选择了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。
答案 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 ,以便在插入新数据时延迟碎片的开始桌子。