[SQL] 提升索引效能-Index重組

  • 7745
  • 0

[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

image

 

(2)接著以下Command,可以協助取得某個index的相關資訊

DBCC SHOWCONTIG(index name)

image

相關資訊的意義,可參考MSDN文件

image

(取自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相關數據

image

 

可以看到在數值上有明顯的改善

 

結論:

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