2017-10-19 466 views
1

我接近Express對主數據庫文件的10 GB限制。SQL Server Express 2008 10GB大小限制

主要的問題似乎是一些固定長度的char(500)列永遠不會接近那個長度。

我有兩個表格,它們之間有大約200萬行。這兩個表格總計約8 GB的數據,其餘的則分佈在另外20個表格左右。這兩個表格各有2個char(500)列。

我正在測試一種方法將這些列轉換爲varchar(500)並恢復尾隨空格。

我嘗試這樣做:

Alter Table Test_MAILBACKUP_RECIPIENTS 
Alter Column SMTP_address varchar(500) 
GO 
Alter Table Test_MAILBACKUP_RECIPIENTS 
Alter Column EXDN_address varchar(500) 

這迅速改變列的類型,但顯然沒有恢復的空間。

我可以看到成功地做到這一點的唯一方法是:

  1. varchar(500)列tempdb中創建一個新表,

  2. 複製信息到臨時表中修剪掉尾部的空格,

  3. 刪除實際表,

  4. 重新創建與新的varchar(500)列的真實表,

  5. 將信息複製回來。

我對這裏的其他想法持開放態度,因爲我必須在此過程完成時將我的應用程序脫機?

我很好奇的另一件事是主鍵標識列。 此表具有設置爲標識的主鍵字段。 我知道我必須使用Set Identity_Insert來允許將記錄插入表中,並在完成時將其關閉。

如何重新創建表影響完成後插入表中的新記錄。或者這只是「微軟魔術」,我不需要擔心呢?

回答

0

與你最初的方法是,在轉換的列varchar但沒有修剪現有空格(它在轉換之後保持)的問題,改變了列你的數據類型後應該做的:

update Test_MAILBACKUP_RECIPIENTS set 
    SMTP_address=rtrim(SMTP_address), EXDN_address=rtrim(EXDN_address) 

這將消除您表中的所有尾隨空格,但請注意實際的磁盤大小將相同,因爲SQL Server不會自動收縮數據庫文件,只會將該空間標記爲未使用並可用於其他數據。

你可以使用這個腳本從另一個問題,看在DB文件中使用的數據的實際空間:

Get size of all tables in database

通常收縮數據庫是推薦,但是當有很多的用空間和磁盤大小之間的差異可以用dbcc shrinkdatabase做到這一點:

dbcc shrinkdatabase (YourDatabase, 10) -- leaving 10% of free space for new data 
+0

阿爾貝託嗨,這似乎正是我需要與PP4_MailBackup表做。我後來認爲我應該可以做你的建議,但不知道我是否可以像這樣寫一個專欄。有了這麼大的表格,我很難複製測試數據來嘗試一些東西。我不需要縮小數據庫,因爲我不缺少磁盤空間,但這應該可以解決我的10Gb限制。我還沒有嘗試過,但我會將您的答案標記爲解決方案。謝謝! –

+0

如果您想首先進行測試併爲temp數據庫提供足夠的空間來創建'begin transaction',然後執行更新,並選擇一切正常,如果不僅僅是'rollback'(或'commit'使變化永久)。爲了安全起見,我大多數時間使用事務來執行這種類型的更新(如果您執行多個更新,您可以使用select @@ trancount來檢查您是否已經有活動事務)。 –

+0

這是一個好主意。我需要學習如何做這種東西。我應該在臨時數據庫中有足夠的空間,除非它需要將我的文件流列存儲在那裏。我假設tempdb也會有一個與主數據庫相同的10Gb限制。 –

0

好的我做了一個SQL備份,禁用了應用程序,並嘗試了我的腳本。 我感到非常震驚,它在我慢的舊服務器上運行了2分鐘。

我重新啓用了我的應用程序,它仍然有效。 (Yay)

查看錶格的報告大小現在從1.4GB變爲126Mb!所以至少有一段時間給我買了。 (我已經盤旋在KB的數據大小)

enter image description here

之前之後 enter image description here

我的下一個問題是MailBackup表,也有兩個CHAR(500)列。

它顯示爲6.7GB。 我不能使用相同的方法,因爲這個表包含一個FileStream列,它有大約190GB的數據,而據我所知,tempdb不支持FleStream。 看起來這可能是值得一個新的問題。