0

I have been trying to defrag indexes in SQL Server 2005 and nothing seems to work. I have created multiple Maintenance Plans using the wizard but the job always fails. I have run the script from this site, which is originally from 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/

Even if I go to the specific table in Object Explorer and select the Indexes folder and select Rebuild All the fragmentation % never changes, even though it reports as completing as successful.

Shouldn't a rebuilt index have 0% fragmentation? If so why would this sql not work:

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 )

This is the sql generated by selected Rebuild Index.

4

2 回答 2

0

尽管可能与其他响应中建议的非常小的数据库有关,但问题更可能与 FILLFACTOR 相关

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

您可以通过查看 sys.indexes 表来查询给定索引的当前填充因子值,查询类似于 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可能是个好主意,以便在将新数据插入表中时延迟碎片的开始。

于 2009-11-05T14:58:36.520 回答
0

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

于 2009-11-05T14:02:35.863 回答