--如何知道是否發生了索引碎片 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('DB_DJSMS'),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管理工作台進行索引碎片的整理
使用SQL Server管理工作台整理索引碎片 什么時候用重組什么時候用重建呢? 當對應索引的外部碎片值介於10-15之間內部碎片值介於60-75之間時使用重組其它情況就應該使用重建 值得注意的是重建索引時索引對應的表會被鎖定但重組不會鎖表因此在生產系統中對大表重建索引要慎重因為在大表上創建索引可能會花幾個小時 幸運的是從SQL Server 2005開始微軟提出了一個解決辦法在重建索引時將ONLINE選項設置為ON這樣可以保證重建索引時表仍然可以正常使用 雖然索引可以提高查詢速度但如果你的數據庫是一個事務型數據庫大多數時候都是更新操作更新數據也就意味着要更新索引 這個時候就要兼顧查詢和更新操作了因為在OLTP數據庫表上創建過多的索引會降低整體數據庫性能 如果你的數據庫是事務型的平均每個表上不能超過5個索引 如果你的數據庫是數據倉庫型平均每個表可以創建10個索引都沒問題