2009-12-01 36 views
1

我有一個Sql Server 2005數據庫,其中包含佔用大量空間(總計超過10 GB)的許多表,並且這些表中沒有行。我可以通過右鍵單擊屬性(數據空間和行計數項目)來查看空間和行數。沒有行的大桌子?

任何想法?

回答

2

當數據被刪除時,事務日誌和數據文件不會縮小,假設您將再次使用它。如果您真的需要,可以使用DBCC SHRINKFILE和/或DBCC SHRINKDATABASE回收空間。

1

隨着記錄被刪除,可用空間不會從數據庫中刪除。相反,它會留在那裏,並在稍後添加新記錄時重複使用。

您可以手動收縮數據庫,或將其設置爲定期自動收縮。

手動萎縮:

  • 與鍵盤:從一個查詢窗口,使用DBCC SHRINKDATABASE DBNAME。
  • 使用鼠標:在Management Studio中,右鍵單擊數據庫,然後選擇任務 - >收縮 - >數據庫。

自動收縮:

  • 與鍵盤:從一個查詢窗口,ALTER DATABASE DBNAME SET AUTO_SHRINK ON。
  • 使用鼠標:在Management Studio中,右鍵單擊數據庫,選擇「屬性」,選擇「選項」,然後將「自動縮小」設置爲「真」。

對文檔的快速瀏覽僅表明自動收縮會「週期性」發生。我沒有注意到這段時間是什麼。

當您收縮數據庫時,默認情況下,只有文件末尾的空白頁被刪除。所以如果你的數據庫有大量的空頁面,然後是一個使用過的頁面,那麼它不會收縮太多。當通過GUI縮小它時,縮放對話框中有一個選項「在釋放未使用的空間之前重新組織文件」。選中此選項將導致在截斷尾部空白空間之前將使用的頁面移動到文件的前部,但也會花費更長的時間。

0

通過BradC在https://serverfault.com/questions/89814/sql-server-huge-tables-with-no-rows

重建表上,包括聚集索引的所有索引。來自Books Online

重建指數下降和 重新創建索引。這將刪除 碎片,通過 回收基於 指定或現有填充因子 設置的頁面,並將連續頁面中的索引行 重新排序。

喜歡的東西:

ALTER INDEX ALL ON [lc_db_user].[JMS_MESSAGES] REBUILD 

DBCC SHRINKDATABASE或(更優選)如果空間實際上已被從表本身釋放DBCC SHRINKFILE只會做一些事情。另請確保您熟悉issues associated with shrinking database files。執行摘要:永遠不要使用自動收縮,只在必要時收縮文件,並且始終使用完全重新索引來對所有剛分離的索引進行碎片整理。