SQL Server誤區(qū)30日談 第29天 有關(guān)堆碎片的誤區(qū)
發(fā)布日期:2022-01-07 11:17 | 文章來源:腳本之家
誤區(qū) #29:可以通過對(duì)堆建聚集索引再DROP后進(jìn)行堆上的碎片整理
Nooooooooooooo!!! 對(duì)堆建聚集索引再DROP在我看來是除了收縮數(shù)據(jù)庫(kù)之外最2的事了。
如果你通過sys.dm_db_index_physical_stats(或是老版本的DBCC SHOWCONTIG)看到堆上有碎片,絕對(duì)不要通過建立聚集索引再刪除聚集索引來整理堆碎片。好的做法應(yīng)該是建立聚集索引之后不再刪除,已經(jīng)有非常多的資料闡述如何選擇一個(gè)理想的聚集索引鍵--窄,很少變動(dòng),唯一,自增。Kimberly有一篇文章對(duì)此做了一個(gè)總結(jié):Ever-increasing clustering key - the Clustered Index Debate..........again!(注意,是基于SQL Server 2005版本),對(duì)此我也有一個(gè)例子:An example of a nasty cluster key。
你也可以在SQL Server 2008中通過ALTER TABLE ... REBUILD來清除堆碎片,但這個(gè)做法和建立聚集索引后再刪除同樣邪惡。
如果你想問為什么我對(duì)此甚有成見?好吧,那我解釋一下:非聚集索引中每一行都會(huì)指向一個(gè)RID或是聚集索引鍵的鏈接(詳情請(qǐng)看:What Happens if I Drop a Clustered Index?),這個(gè)鏈接會(huì)以下面兩種方式之一出現(xiàn):
Nooooooooooooo!!! 對(duì)堆建聚集索引再DROP在我看來是除了收縮數(shù)據(jù)庫(kù)之外最2的事了。
如果你通過sys.dm_db_index_physical_stats(或是老版本的DBCC SHOWCONTIG)看到堆上有碎片,絕對(duì)不要通過建立聚集索引再刪除聚集索引來整理堆碎片。好的做法應(yīng)該是建立聚集索引之后不再刪除,已經(jīng)有非常多的資料闡述如何選擇一個(gè)理想的聚集索引鍵--窄,很少變動(dòng),唯一,自增。Kimberly有一篇文章對(duì)此做了一個(gè)總結(jié):Ever-increasing clustering key - the Clustered Index Debate..........again!(注意,是基于SQL Server 2005版本),對(duì)此我也有一個(gè)例子:An example of a nasty cluster key。
你也可以在SQL Server 2008中通過ALTER TABLE ... REBUILD來清除堆碎片,但這個(gè)做法和建立聚集索引后再刪除同樣邪惡。
如果你想問為什么我對(duì)此甚有成見?好吧,那我解釋一下:非聚集索引中每一行都會(huì)指向一個(gè)RID或是聚集索引鍵的鏈接(詳情請(qǐng)看:What Happens if I Drop a Clustered Index?),這個(gè)鏈接會(huì)以下面兩種方式之一出現(xiàn):
- 如果非聚集索引所在的表是堆,那么這個(gè)鏈接就是一個(gè)RID。
- 如果非聚集索引所在的表是聚集索引,那么這個(gè)鏈接就是聚集索引鍵。
如果你希望對(duì)此有更多了解,請(qǐng)看文章底部的鏈接。
因此不難看出,如果你希望將堆變?yōu)榫奂饕?,那么非聚集索引的所有RID就失效了,因此所有的非聚集索引都需要被重建。同樣,如果刪除聚集索引鍵,那么所有非聚集索引上存儲(chǔ)的聚集索引鍵都會(huì)失效,因此也需要重建所有的非聚集索引。
簡(jiǎn)單點(diǎn)說,如果你建立再刪除聚集索引后,所有的非聚集索引都會(huì)被重建兩次。
如果你使用SQL Server 2008的ALTER TABLE ... REBUILD來整理堆碎片,那么同樣也需要重建所有的非聚集索引,因?yàn)樗械腞ID都會(huì)變動(dòng)。
那么,如果對(duì)于“重建”聚集索引呢?這取決于SQL Server的版本以及你是進(jìn)行rebuild索引亦或是改變索引。一個(gè)常見的誤區(qū)是對(duì)表進(jìn)行分區(qū)將會(huì)改變聚集索引鍵,但事實(shí)上不會(huì)。對(duì)于那些會(huì)引起非聚集索引重建的操作,請(qǐng)看如下列表:Indexes From Every Angle: What happens to non-clustered indexes when the table structure is changed?。
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
相關(guān)文章