[SQL] 提升索引效能-Index重組
一般為了提升查詢效能,我們都會在資料表上建立合適的index,借著index鍵來加快查詢效能
,但是隨著時間及資料的變動,index的效用會跟著遞減,因此在維護上,可以採取index重組
的方式,藉以恢復index應有的效能
(1)在評估上,可先以下面的Command來找出目前index碎裂情況,碎裂愈嚴重,愈無法發揮
index應有的效能
select indexs.name as indexname
, round(index_physical.avg_fragmentation_in_percent,2) as [fragmentation(%)]
from sys.dm_db_index_physical_stats(DB_ID('Your DB Name'),OBJECT_ID('currency'), NULL, NULL, NULL) index_physical
inner join sys.indexes indexs on index_physical.object_id = indexs.object_id and index_physical.index_id=indexs.index_id
order by index_physical.avg_fragmentation_in_percent DESC
(2)接著以下Command,可以協助取得某個index的相關資訊
DBCC SHOWCONTIG(index name)
相關資訊的意義,可參考MSDN文件
(取自MSDN:http://msdn.microsoft.com/zh-tw/library/ms175008.aspx)
- 掃描密度愈小,表示項目連續性愈差
- 邏輯掃描片段表示掃描索引分頁時所傳回失序頁面的百分比,數值愈高表示分頁失序程度愈高
- 平均頁面密度,則表示頁面飽和度的情況,數值愈高愈好
通常只要這幾點如不甚理想時,就可以可慮進一步進行index重組
(3)進行index重組,可以採用以下Command
DBCC INDEXDEFRAG (DB Name, 'Table Name',Index Name)
執行完成後,可以重覆(2)的Command,再一次看看該index相關數據
可以看到在數值上有明顯的改善
結論:
index除了適定的建立之外,定期的重整是有其必要的,就像硬碟用久了相信一般人也都
知道需要做個重組,index也是一樣,特別是針對異動頻繁及資料量大的Table,index的
重整有助於B-tree發揮搜尋資料應有的效能。
PS:
- 根據MSDN文件表明DBCC SHOWCONTIG在下一版不再提供,改以
sys.dm_db_index_physical_stats取代
- 根據MSDN文件表明DBCC INDEXDEFRAG在下一版不再提供,改以ALTER INDEX取代
Ref:
http://msdn.microsoft.com/zh-tw/library/ms175008.aspx
http://technet.microsoft.com/zh-tw/library/ms177571.aspx
http://msdn.microsoft.com/zh-tw/library/ms188917.aspx
小弟不是專業DBA,文中若有錯誤,敬請指正
By No.18