2014-01-23 120 views
2

我們的生產服務器是sql server 2005,我們有一個非常大的表,包括103萬條記錄。我們希望從varchar(20)到varchar(30)增加一個特定字段的長度。雖然我說它只是一個元數據變化,因爲它增加了列長度,我的經理說他不想改變這麼大的表格。建議最好的選擇。我正在考慮創建一個新列,並用舊列值更新新列。在大表中增加列長度

我看了很多博客,他們說改變會影響,有人說它不會影響。

+1

將int轉換爲bigint有類似的問題。最終節省了大量時間重新創建整個表並將數據批量插入到其中。改變柱子的時間會延長5倍。 –

+0

我認爲很多這些過程應該只是元數據,但不是,隨着時間的推移會得到改進和修復。我知道在SQL Server 2012中存在一些增強功能,例如,添加非空列可以是聯機操作(而可空列可以阻止和更新整個表,具體取決於方案)。我懷疑這些增強功能在SQL Server 2005中都不存在。我完全同意你這個*應該是一個僅用於元數據的更改,但我只是將它作爲註釋發佈,因爲我不確定*在2005年這與更改INT - > BIGINT相同。 –

回答

1

正如您所說,它是一個僅用於元數據的操作,這是一條路。通過測試證明你是對的,向你的經理證明你的經理(並且向你自己!)。

+0

同意。我可以發表一個答案,說「這是一個只有元數據的操作」,但如果不測試自己,你怎麼確定? –

+0

@AaronBertrand。 。 。你知道每個數據頁面上是否存儲'varchar()'的聲明長度?或者只是存儲的實際長度? –

+0

@GordonLinoff副手,不知道,對不起。我無法想象*聲明的長度存儲在每個頁面上,但沒有記住頁面內容(並且它可能在數據和索引中不同,當然還有將列存儲和Hekaton添加到組合中......) –

1

您應該首先測試任何建議,除非來自實際可能知道發生的詳細信息的SQL Server MVP。

但是,將varchar長度從20更改爲30不會影響表中任何現有數據的佈局。也就是說,這兩個變量的佈局完全相同。這意味着當您更改表格時,數據不會更改。

這讓人感到樂觀,認爲這種變化是「容易的」。

數據頁面確實包含一些關於類型的信息 - 至少是記錄中類型的長度。我不知道這是否包含字符類型的最大長度。數據頁面可能需要更改。

這是一種悲觀主義。

幾乎任何其他更改都需要對每個記錄和/或數據頁面進行更改。例如,從int變爲bigint正在從4字節字段變爲8字節字段。 全部記錄受此數據佈局變化的影響。大變化。

varchar()更改爲nvarchar()char()會產生相同的影響。

另一方面,將字段從NULLABLE改爲NOT NULLABLE(反之亦然)不會影響每個頁面上的記錄存儲。但是,該信息存儲在頁面的NULLABLE標誌數組中,因此所有頁面都需要更新。

因此,有可能更改不會導致任何數據被重寫。但是在一張小桌子上測試看看會發生什麼。

+2

現在來吧,即使SQL Server MVP也可以犯錯誤。 –

+0

當我寫這些時,我確實已經記住了你。 –

+0

@AaronBertrand。 。 。不,亞倫,這不是一種侮辱。這是我的一個錯誤陳述。你的答案通常是點亮的。 –