碎片是个很讨厌的东西,就像我们的记忆,时间长了,也容易变成碎片,不整理就会再也想不起来。数据库在设计时,为了提高查询的效率,引入索引的概念,就像分门别类的图书,记录一个地址,就知道东西放在哪儿,找起来更方便。但索引也是数据,需要地方存放,由于计算机存储的特点,时间一久这些数据也是东一块儿西一块儿,同样需要拾掇一下。
在SQL Server2000中,采用DBCC SHOWCONTIG/REDBINDEX来查看索引状态及重建索引,到了Sql Server2005,已经改用系统函数sys.dm_db_index_physical_stats对索引进行分析,使用 ALTER INDEX .. REORGANIZE 语句重新组织索引,使用 ALTER INDEX .. REBUILD 语句重建索引。以下为示例。
1、查看索引的碎片信息
USE AdventureWorks;
GO
SELECT a.index_id, name, avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(), OBJECT_ID(N'Production.Product'),
NULL, NULL, NULL) AS a
JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;
GO
这段语句可以查看表Production.Product的索引碎片。avg_fragmentation_in_percent 是个反应碎片情况的百分比,如果小于30,建议重新组织一下索引,如果大于30则应该重建了。
2、重建索引
ALTER INDEX ALL ON [dbo].[RecordTable]
REBUILD WITH (
SORT_IN_TEMPDB = ON
,STATISTICS_NORECOMPUTE = ON
,ONLINE = ON);
这段语句表示重建表RecordTable的所有索引,with后面跟了一些参数。
更详细的用法请参考SQL Server2005的联机丛书,搜索sys.dm_db_index_physical_stats。