Sql-Server
重建索引不釋放空間
昨天我遇到了一種情況,我的索引被重建並且數據庫大小增加了一倍(新大小的 50% 未被使用)。排序中
tempdb
設置為關閉,我得到的印像是這種重建導致它(索引重建不在tempdb
)。完成/潛在故障後重建過程是否有理由保留磁碟空間?
如果您期望重建以使文件系統中的數據文件更小,那麼它不是這樣工作的。
事實上,重建甚至會導致磁碟上的數據文件更大,因為新的頁面和擴展區被分配來保存數據的副本。當舊頁面從索引中刪除時,它們實際上並沒有從任何東西中刪除,它們只是被釋放了。
您已經重建了索引並在數據文件中節省了一些空間。這意味著,當您添加更多數據(到此表和其他表)時,數據文件不必立即增長來為新數據騰出空間。
這是一件好事。增大文件是一項昂貴的阻塞操作,您希望將其最小化。縮小文件以暫時取回一些磁碟空間似乎是一個失敗的原因。數據文件稍後會再次增長,在這種情況下,您將如何處理您暫時恢復的磁碟空間?將其出租給某人,然後在您的數據庫必須再次增長時驅逐他們?只需將其保留為現在的大小,因為除非您將其標記為只讀,否則它很可能會再次增長到該大小。
數據文件只是一個容器。獨自一人,它只會成長。它不會僅僅因為您刪除了一些行或重建了一些索引或刪除了一個表而縮小。SQL Server 不會釋放磁碟空間並為您收縮文件,同時它不會僅僅因為您刪除了恰好載入到緩衝池中的索引而將記憶體釋放回作業系統:它假設您將再次使用該空間/記憶體,並且知道繼續釋放它並重新聲明它是昂貴的。所以它只是堅持下去。
而且,在幾乎所有情況下,你都會想要這樣。如果您確實需要回收一些您知道不會再次使用的空間,請參閱這篇文章。