昨天介紹了查看索引的使用情況來決定那些索引是否需要被保留,
由於現今交易頻繁的OLTP環境中,每日經常有許多資料被異動會造成索引的不連續性,
將會增加搜尋特定資料的時間,
因此今天則是要介紹DMV來找出索引破碎程度,再決定是否需要重組或重建索引。
找出指定資料庫的所有索引破碎程度
USE AdventureWorks2008;
GO
SELECT OBJECT_NAME(dt.object_id),si.name,dt.avg_fragmentation_in_percent,dt.avg_page_space_used_in_percent
FROM
(SELECT object_id,index_id,avg_fragmentation_in_percent,avg_page_space_used_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, 'DETAILED')
WHERE index_id <> 0
) AS dt
INNER JOIN sys.indexes si
ON si.object_id = dt.object_id
AND si.index_id = dt.index_id
微軟的官方主件建議avg_fragmentation_in_percent的值,
大於5%且小於等於30%時,使用重組成本較低的ALTER INDEX REORGANIZE敍述,
大於30%時,則是使用重建成本和時間較高的ALTER INDEX REBUILD敍述。
以上範例:
找出IX_ProductReview_ProductID_Name的avg_fragmentation_in_percent值為66.666,
故需要設定排程定期重新Rebuild Index。
USE AdventureWorks2008;
GO
ALTER INDEX IX_ProductReview_ProductID_Name ON Production.ProductReview
REBUILD;
GO
因為在重建索引時,該索引會被鎖定且不能被讀取的,
只有企業版才能支援線上索引重建的功能。
注意:在重建大型索引時需注意Log將會同步大量新增,
需適時的Shrink或備份Log檔,好讓Log檔Size縮小