索引碎片整理

stephenjwq發表於2019-04-18
查詢是否發生了索引碎片
SELECT object_name(dt.object_id) Tablename,si.name Indexname,dt.avg_fragmentation_in_percent AS ExternalFragmentation,
dt.avg_page_space_used_in_percent AS internalFragmentation
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('SmartTRMUAES'),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 AND dt.avg_fragmentation_in_percent>10
AND dt.avg_page_space_used_in_percent<75 ORDER BY avg_fragmentation_in_percent
DESC
使用下面的規則分析結果,你就可以找出哪裡發生了索引碎片:
1)ExternalFragmentation的值>10表示對應的索引發生了外部碎片;
2)InternalFragmentation的值<75表示對應的索引發生了內部碎片。
如何整理索引碎片?
有兩種整理索引碎片的方法:
1)重組有碎片的索引:執行下面的命令
ALTER INDEX ALL ON TableName REORGANIZE
2)重建索引:執行下面的命令
ALTER INDEX ALL ON TableName REBUILD WITH (FILLFACTOR=90,ONLINE=ON)
也可以使用索引名代替這裡的“ALL”關鍵字重組或重建單個索引,也可以使用SQL Server管理工作臺進行索引碎片的整理。
什麼時候用重組,什麼時候用重建呢?
  當對應索引的外部碎片值介於10-15之間,內部碎片值介於60-75之間時使用重組,其它情況就應該使用重建。
  值得注意的是重建索引時,索引對應的表會被鎖定,但重組不會鎖表,因此在生產系統中,對大表重建索引要慎重,因為在大表上建立索引可能會花幾個小時,幸運的是,從SQL Server 2005開始,微軟提出了一個解決辦法,在重建索引時,將ONLINE選項設定為ON,這樣可以保證重建索引時表仍然可以正常使用。
  雖然索引可以提高查詢速度,但如果你的資料庫是一個事務型資料庫,大多數時候都是更新操作,更新資料也就意味著要更新索引,這個時候就要兼顧查詢和更新操作了,因為在OLTP資料庫表上建立過多的索引會降低整體資料庫效能。
  我給大家一個建議:如果你的資料庫是事務型的,平均每個表上不能超過5個索引,如果你的資料庫是資料倉儲型,平均每個表可以建立10個索引都沒問題。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9522838/viewspace-2641751/,如需轉載,請註明出處,否則將追究法律責任。

相關文章