1. 程式人生 > >SQL Server索引碎片整理實際操作記錄

SQL Server索引碎片整理實際操作記錄

刪除 inner dog man and 嘗試 語句 ssd ext

SQL Server 版本是 2008 R2。

查詢數據庫索引碎片情況的 SQL 語句(來源):

技術分享
SELECT OBJECT_NAME(ind.OBJECT_ID) AS TableName, 
ind.name AS IndexName, indexstats.index_type_desc AS IndexType, 
indexstats.avg_fragmentation_in_percent 
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) indexstats 
INNER JOIN sys.indexes ind  
ON ind.object_id = indexstats.object_id 
AND ind.index_id = indexstats.index_id 
WHERE indexstats.avg_fragmentation_in_percent > 50 
ORDER BY indexstats.avg_fragmentation_in_percent DESC
技術分享

索引碎片整理的四種方法:

1)刪除索引並重建

2)使用 DROP_EXISTING 語句重建索引

3)使用 ALTER INDEX REBUILD 語句重建索引

4)使用 ALTER INDEX REORGANIZE 重新組織索引

詳見:SQL Server索引的維護 - 索引碎片、填充因子 <第三篇>

我們使用的是方法三 Rebuild 與方法四 Reorganize 。

對有些數據記錄比較多、即使訪問低峰也被經常訪問的表進行索引 Rebuild 會失敗,嘗試刪除索引也失敗,出現 "Lock request time out period exceeded." 的錯誤,後來改用 Reorganize 操作成功。在對有些表的索引進行 Reorganize 操作時出現了 SQL Server Management Stuido 窗口一直卡死的問題,後來通過 Windows 任務管理器強制結束了這個窗口,結束後發現索引碎片已成功整理。

對於 IndexType 為 HEAP 的索引碎片,只需為對應的表創建聚集索引,索引碎片就會自動消失。

對於記錄數超過600萬的表,無論是聚集索引還是非聚集索引,只要進行 Rebuild 操作,就會阻塞所有對該表查詢操作,只能使用 Reorganize ,對該表的聚集索引進行 Reorganize 操作耗時 26 分鐘。

SQL Server索引碎片整理實際操作記錄