文章出處
文章列表
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 分鐘。
文章列表
全站熱搜