2011-09-22 21 views
78

我正在使用SQL Server 2008,並且我需要在具有大約500k行的表上從(200到1200)變大一個VARCHAR字段。我需要知道的是,如果有任何問題我沒有考慮。在大型表上增加VARCHAR列的大小時是否會有問題?

我將使用這個TSQL語句:

ALTER TABLE MyTable 
ALTER COLUMN [MyColumn] VARCHAR(1200) 

我已經嘗試過它的數據的副本,這個聲明沒有不良影響,我可以看到。

那麼是否有任何可能的問題,我可能沒有考慮這樣做?

順便說一句,該列沒有編入索引。

+1

@nonnb:這是一個可怕的想法。 http://stackoverflow.com/q/2091284/27535 – gbn

+0

@gbn對Justin最近對這個問題的回答有什麼想法?似乎有點與你的不一致。 – AakashM

+0

@AakashM:他對存儲是正確的,但它是一種開銷,而不是優化。現在請閱讀http://stackoverflow.com/q/2009694/27535 – gbn

回答

54

這只是一個元數據更改:它很快。

的觀察:指定NULL或NOT NULL明確,以避免出現「意外」,如果的SET ANSI_xx設置一個在OSQL不同如運行不SSMS出於某種原因

+1

所有這一切都很好。沒問題。 –

+0

你知道從varchar(200)到varchar(max)時是否適用相同的規則? – CodeNaked

+0

@CodeNaked:這是一個很難回答。 (max)是一個LOB類型,可以是「行內」或行外。不過,我傾向於說它應該是相同的,因爲數據已經「在行」,並且不需要表重建 – gbn

4

更改爲從varchar VARCHAR(1200)(200 )應該不會引起任何問題,因爲它只是一個元數據更改,並且由於SQL Server 2008會截斷超出的空格,因此您應該看到沒有性能差異,因此簡而言之,進行更改應該沒有問題。

+0

我相信這可能適用於小表,但對於正在積極查詢的大表可能會阻塞很長時間(因爲SQL Server需要查看是否需要截斷每一行)。 – CodeNaked

-3

在我的情況改變的列並沒有工作,所以可以使用 '修改' 命令,如:

ALTER TABLE [表名] MODIFY柱[COLUMN_NAME] VARCHAR(1200);

+4

這是因爲你沒有在每個問題上使用SQL Server(但可能是MySQL)。 「ALTER TABLE ... MODIFY」不是有效的T-SQL。 –

5

只想添加我的2美分,因爲我用Google搜索這個問題,B/C,我發現自己在一個類似的情況......

注意在改變從varchar(xxx)varchar(yyy)是元數據確實改變了,但改爲varchar(max)不是。因爲varchar(max)值(又名BLOB值 - 圖像/文本等)在磁盤上的存儲方式不同,而不是在表格行內,而是「行外」。所以服務器會在一張大桌子上堅持下來,並在幾分鐘(小時)內變得沒有反應。

--no downtime 
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(1200) 

--huge downtime 
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(max) 

PS。同樣適用於nvarchar或課程。