我有一張擁有超過1.5億條記錄的表。目前的類型如下:在非常大的表上縮小數據類型
id (Primary Key, Bigint)
idResult (Foreign key, Bigint null)
idItem (Foreign Key, Bigint null)
Number_1 (Bigint null)
Number_2 (Bigint null)
IsActive (Bigint null)
Number_1和Number_2永遠不會大於10. IsActive明顯是布爾值。並且這些列中的任何一個都不能在代碼庫的其他地方空着。我還想將外鍵字段更改爲int,但這是另一回事。這張桌子是在我開始幾年前建成的,我們正在經歷一些成長的痛苦。
我正在尋找轉換這些列(和其他表上的其他幾個人,儘管這是主要罪犯)的最佳方式,並回收該磁盤空間。我嘗試過直線Alter Table
,但是,有些預計,這只是無效。我不記得具體的錯誤,但我相信這與相關表格的大小有關。
現在我正在考慮手動刪除和重新創建表格,但我正在努力找出一個更好的方法來做到這一點,除了使用Select TOP 10000 * FROM dbo.TABLENAME WHERE id > 0
,並且只是多次增加where子句。
我已經看過Switch To
,但這需要目標表的數據類型與源表匹配,這正是我試圖解決的問題!
有什麼建議嗎?我看着這個錯誤的方式嗎?
該錯誤消息將是有益的看到的。原則上沒有什麼會阻止這種操作。也許日誌已滿。您是否考慮過ROW和PAGE壓縮?我相信他們可以縮小數據類型的大小。 – usr 2014-11-24 21:52:53
它給了我一個不同的錯誤之前,但現在我所得到的是一個超時。 >。無論如何,根據http://aboutsqlserver.com/2010/09/01/hidden-facts-about-table-alteration/這聽起來像做一個改變不會實際上減少磁盤上的行大小。 – anick 2014-11-24 22:02:32
重建確實釋放了空間。關閉超時並繼續。 – usr 2014-11-24 22:08:31