数据库 · 2015-06-24

MSSQL 2005 查看表的索引碎片状态

MSSQL 2005 提供了一个动态管理函数 sys.dm_db_index_physical_stats
通过调用这个函数,可以方便直观地查看到指定表或视图的数据和索引的大小和碎片信息。
下面这条语句,就可以查看当前数据库中所有索引的碎片情况
SELECT
object_name(a.object_id) [TableName]
,a.index_id
,name [IndexName]
,avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats
(
DB_ID()
, NULL
, NULL, NULL, NULL
) AS a
JOIN sys.indexes AS b
ON a.object_id = b.object_id AND a.index_id = b.index_id;
如果 avg_fragmentation_in_percent 一项的值在
10.0 – 30.0 建议使用 ALTER INDEX .. REORGANIZE 语句重新组织索引
> 30.0 建议使用 ALTER INDEX .. REBUILD 语句重建索引
SQL 2005 在 ALTER INDEX 语句中提供了一个重要的参数 ONLINE,如果想重建索引的时候,不会将表锁住,需要将该参数设置为 ON。
例如:
ALTER INDEX ALL ON [dbo].[RecordTable]
REBUILD WITH (
SORT_IN_TEMPDB = ON
,STATISTICS_NORECOMPUTE = ON
,ONLINE = ON);
ONLINE 参数说明如下:
ONLINE = { ON | OFF }
指定在索引操作期间基础表和关联的索引是否可用于查询和数据修改操作。默认值为 OFF。

ON
在索引操作期间不持有长期表锁。在索引操作的主要阶段,源表上只使用意向共享 (IS) 锁。这使得能够继续对基础表和索引进行查询或更新。操作开始时,将对源对象保持极短时间的共享 (S) 锁。操作结束时,如果创建非聚集索引,将对源持有极短时间的 S 锁;当在线创建或删除聚集索引时,或者重新生成聚集或非聚集索引时,将获取 SCH-M(架构修改)锁。对本地临时表创建索引时,ONLINE 不能设置为 ON。
OFF
在索引操作期间应用表锁。创建、重新生成或删除聚集索引或者重新生成或删除非聚集索引的脱机索引操作将对表获取架构修改 (Sch-M) 锁。这样可以防止所有用户在操作期间访问基础表。创建非聚集索引的脱机索引操作将对表获取共享 (S) 锁。这样可以防止更新基础表,但允许读操作(如 SELECT 语句)。
有关详细信息,请参阅联机索引操作的工作方式。有关锁的详细信息,请参阅锁模式。

索引(包括全局临时表中的索引)可以联机重新生成,但以下索引除外:

禁用的索引
XML 索引
本地临时表中的索引
分区索引
聚集索引(如果基础表包含 LOB 数据类型)。
使用 LOB 数据类型列定义的非聚集索引
如果表包含 LOB 数据类型,但这些列中没有任何列在索引定义中用作键列或非键列,则可以联机重新生成非聚集索引。