本帖最后由 yanyangtian4502 于 2012-6-6 09:56 编辑
对于,索引碎片,主要就是在有索引的表上面不断的进行数据操作(增,删,改)
从而导致索引页上面出现很多的碎片空间,这一点和我们磁盘的碎片产生的道理类似,
索引碎片 找起来也简单,我也收集了一些查询,可以很快的找出碎片问题:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT
DB_NAME() AS DatbaseName
, SCHEMA_NAME(o.Schema_ID) AS SchemaName
, OBJECT_NAME(s.[object_id]) AS TableName
, i.name AS IndexName
, ROUND(s.avg_fragmentation_in_percent,2) AS [Fragmentation %]
INTO #TempFragmentation
FROM sys.dm_db_index_physical_stats(db_id(),null, null, null, null) s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON i.object_id = O.object_id
WHERE 1=2
EXEC sp_MSForEachDB 'USE [?];
INSERT INTO #TempFragmentation
SELECT TOP 20
DB_NAME() AS DatbaseName
, SCHEMA_NAME(o.Schema_ID) AS SchemaName
, OBJECT_NAME(s.[object_id]) AS TableName
, i.name AS IndexName
, ROUND(s.avg_fragmentation_in_percent,2) AS [Fragmentation %]
FROM sys.dm_db_index_physical_stats(db_id(),null, null, null, null) s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON i.object_id = O.object_id
WHERE s.database_id = DB_ID()
AND i.name IS NOT NULL
AND OBJECTPROPERTY(s.[object_id], ''IsMsShipped'') = 0
ORDER BY [Fragmentation %] DESC'
SELECT top 20 * FROM #TempFragmentation ORDER BY [Fragmentation %] DESC
DROP TABLE #TempFragmentation
看到的效果图如下:
1. 开始重建碎片率大于80%的索引,语句如下: ALTER INDEX 索引名字 ON 表名 REBUILD 注意: 索引名字:就是需要重建的索引的名字 表名:就是索引所在的表 例如,ALTER INDEX IX_keywordinfo_Type ON KeyWordInfo REBUILD 2. 按照上面的方法一个个的将索引重建,注意:建议在晚上或者周末的时候重建,否则,将会导致用户无法使用数据库。也可以在建立的时候采用online的方式,这种方式会异步的重建。
|