2012-06-19 163 views
1

因此,一個很大的問題剛剛出現了我們正在使用的一些數據庫。出於某種原因,人們的數據庫已經發展到一個荒謬的文件大小,沒有任何數據表的變化。雖然我不知道是什麼原因突然造成這種情況,但我現在更關心清除其使用的磁盤空間。我運行了sp_spaceused,並且追蹤了2個表中的1個(這取決於數據庫)的罪魁禍首。對於每個數據庫,其中一個表分配超過半個GB到預留空間,而數據只有50 MB。它顯示index_size在〜113 MB。該表沒有聚簇索引,並且具有大約15列,除了長度爲255的nvarchar類型的2列(表中通常爲null或空)外,所有長度都相對較小。SQL Server 2000,表分配太多空間

我試過運行DBCC shrinkdatabase和截斷表,但它沒有做任何事情。我已經研究了這一點,其他一些人也遇到了這個問題,但是如果shrinkdatabase沒有解決這個問題,那麼他們也找不到解決方案。

讓我知道是否還有其他人需要了解表或數據庫設置。我不知道還有什麼可以嘗試的,這對我們來說是一個重大問題,因爲人們的數據庫突然佔據了他們以前的空間的10倍。

編輯: 試圖運行DBCC DBREINDEX並試圖更改爲通過Enterprise Manager聚簇索引後,我得到一個錯誤消息說:

無法爲數據庫「DB」分配新頁。文件組PRIMARY中不再有可用的頁面。可以通過刪除對象,添加其他文件或允許文件增長來創建空間。

我試過從這個表中刪除行,它對錶的大小沒有影響。正如預期的那樣,日誌文件增加,但這是對錶格大小的唯一改變。

回答

2

這些是堆(沒有聚集索引)?爲什麼?

如果用戶做了很多更新或刪除,我會嘗試重建表。 Shrinkdatabase不是這樣做的方式。它不會修復碎片,刪除空間或修改列的寬度,或者將行浪費爲轉發指針。我敢打賭,重建和/或聚集索引的表格會更好。在SQL Server 2000中,您可以通過以下任一方式執行此操作:

(a)添加聚簇索引。 (我無法給你準確的語法來添加聚集索引(或者更改一個現有索引,或者更改一個現有索引,或者非聚集主鍵被聚集),因爲我沒有足夠的關於你的表的信息。)

(b)DBCC DBREINDEX('dbo.tablename');

這將重建堆中的非聚簇索引,但這可能會對你造成浪費,這取決於浪費的空間在哪裏發生。我仍然建議你應該創建一個聚集索引。如果你可以分享你的表的一些細節(例如存在的索引,通常運行什麼類型的查詢,當前如何唯一標識一行以及數據更改/添加到表中的性質),我們可能會提供更多詳細的建議。

+0

我將如何去重建表或更改爲聚集索引?在這個過程中丟失數據是否有風險? – gdawgrancid

+0

正如我所說的,您需要共享關於您的表和現有索引的更多細節,以便獲得準確的語法,以及有關列,查詢以及如何添加數據的詳細信息,如果您希望在上下文中指導您應該放置集羣的位置指數。爲了將聚集索引添加到堆中,語法就是'CREATE [UNIQUE] CLUSTERED INDEX x ON dbo.y(z);'但是您可能希望主鍵被聚集,所以語法將會是不同。沒有數據丟失的風險,但通常沒有任何明確的風險。備份在修改數據庫時始終是您最好的朋友。 –

+0

經過一番修改並且必須更改數據庫的最大文件大小後,我才能夠獲得表上的聚集索引,然後DBCC dbshrink在運行幾次後就能夠縮小大小。我仍然對這件事情有些問題,但我開始認爲它與SQL Server 2000的限制或錯誤有關 – gdawgrancid