Sql-Server

為什麼索引 REBUILD 不能減少索引碎片?

  • May 24, 2020

我使用 ALTER INDEX REBUILD 來刪除索引碎片。在某些情況下,REBUILD 似乎並沒有消除這種碎片。REBUILD 不去除碎片的原因是什麼?似乎這種情況尤其發生在小索引上。

如果索引非常小(我相信少於 8 頁),它將使用混合範圍。因此,它看起來好像仍然存在碎片,因為住房範圍將包含來自多個索引的頁面。

正因為如此,以及在碎片通常可以忽略不計的如此小的索引中,您實際上應該只重建具有特定頁面門檻值的索引。最好的做法是重建至少1000 頁的碎片索引。

這也可能發生在非常大的索引上。

我在一個大約有 7 億行的表上有一些索引,我無法對低於 30% 左右的數據進行碎片整理。問題是數據庫內沒有足夠的連續可用空間來連續排列索引。

要解決不會進行碎片整理的非常大的索引,最好的解決方案是預先調整新數據庫的大小並將所有對象移動到該數據庫,然後在那裡重新創建索引。

引用自:https://dba.stackexchange.com/questions/18372