誤區 #29:可以通過對堆建聚集索引再DROP後進行堆上的碎片整理
Nooooooooooooo!!!
對堆建聚集索引再DROP在我看來是除了收縮數據庫之外最2的事了。
如果你通過sys.dm_db_index_physical_stats(或是老版本的DBCC SHOWCONTIG)看到堆上有碎片,絕對不要通過建立聚集索引再刪除聚集索引來整理堆碎片。好的做法應該是建立聚集索引之後不再刪除,已經有非常多的資料闡述如何選擇一個理想的聚集索引鍵--窄,很少變動,唯一,自增。Kimberly有一篇文章對此做了一個總結:Ever-increasing clustering key - the Clustered Index Debate..........again!(注意,是基於SQL Server 2005版本),對此我也有一個例子:An example of a nasty cluster key。
你也可以在SQL Server 2008中通過ALTER TABLE ... REBUILD來清除堆碎片,但這個做法和建立聚集索引後再刪除同樣邪惡。
如果你想問為什麼我對此甚有成見?好吧,那我解釋一下:非聚集索引中每一行都會指向一個RID或是聚集索引鍵的鏈接(詳情請看:What Happens if I Drop a Clustered Index?),這個鏈接會以下面兩種方式之一出現: