大きなテーブルのVARCHAR列のサイズを増やすと、問題が発生する可能性がありますか?


87

SQL Server 2008を使用していますが、約500k行のテーブルでVARCHARフィールドを(200から1200)に大きくする必要があります。私が知る必要があるのは、私が考慮していない問題があるかどうかです。

このTSQLステートメントを使用します。

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

私はすでにデータのコピーでそれを試しました、そしてこの声明は私が見ることができる悪影響を持っていませんでした。

それで、私が考慮しなかったかもしれないこれをすることからの可能な問題はありますか?

ちなみに、列にはインデックスが付けられていません。


1
@nonnb:それはひどい考えです。stackoverflow.com/q/2091284/27535
gbn 2011

@gbnその質問に対するジャスティンの最近の回答について何か考えはありますか?あなたのものと幾分対立しているようです。
aakashM 2011

@AakashM:彼はストレージについては正しいですが、それはオーバーヘッドであり、最適化ではありません。今、このstackoverflow.com/q/2009694/27535
gbn 2011

@ gbn-インデックス作成に関するMartinSmithの観察と同様に、良い点です。引きこもった。
StuartLC 2011

2
結局、1つの落とし穴がありました!フィールドにインデックスが付けられ、誰かが900bより大きいエントリを入力しようとすると、失敗しました。注意してください。
Paul T Davies

回答:


59

これはメタデータの変更のみです。迅速です。

観察:SET ANSI_xx設定の1つが異なる場合、たとえば何らかの理由でSSMSではなくosqlで実行する場合は、「事故」を回避するためにNULLまたはNOTNULLを明示的に指定してください


1
これですべてうまくいきました。問題はありません。
Paul T Davies

からに行くときに同じルールが適用されるかどうか知っvarchar(200)ていvarchar(max)ますか?
codeNaked 2014年

@CodeNaked:これは答えるのがとても難しいです。(max)は、「行内」または行外のLOBタイプです。ただし、データはすでに「行」にあり、テーブルの再構築は必要ないため、同じである必要があると言いたいです
gbn 2014年

12

私はこの質問をグーグルで検索したので、2セントを追加したかっただけです。私は同じような状況にいることに気づきました...

から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またはコースにも当てはまります。


4

Varchar(200)からVarchar(1200)に変更しても、メタデータの変更のみであり、SQL Server 2008が過剰な空白スペースを切り捨てるため、パフォーマンスの違いも見られないため、問題は発生しません。つまり、変化する。


これは小さなテーブルにも当てはまると思いますが、アクティブにクエリされている大きなテーブルの場合、これはかなりの時間ブロックされる可能性があります(SQLサーバーはすべての行を切り捨てる必要があるかどうかを確認する必要があるため)。
codeNaked 2014年

0

列をvarchar(max)に変換しないようにする必要があるもう一つの理由は、varchar(max)列にインデックスを作成できないためです。


-3

私の場合、alter columnが機能していなかったため、次のように「Modify」コマンドを使用できます。

表の変更[table_name] MODIFY列[column_name] varchar(1200);


5
これは、質問ごとにSQL Serverを使用していないためです(ただし、おそらくMySQL)。「ALTERTABLE ... MODIFY」は有効なT-SQLではありません。
Jeroen Mostert 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.