Khi tăng kích thước của cột VARCHAR trên một bảng lớn có thể có vấn đề gì không?


87

Tôi đang sử dụng SQL Server 2008 và tôi cần tạo trường VARCHAR lớn hơn, từ (200 đến 1200) trên bảng có khoảng 500 nghìn hàng. Điều tôi cần biết là nếu có bất kỳ vấn đề nào tôi chưa xem xét.

Tôi sẽ sử dụng câu lệnh TSQL này:

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

Tôi đã thử nó trên một bản sao dữ liệu và tuyên bố này không có tác động xấu nào mà tôi có thể thấy.

Vì vậy, có bất kỳ vấn đề có thể xảy ra từ việc này mà tôi có thể đã không xem xét?

Nhân tiện, cột không được lập chỉ mục.


1
@nonnb: đó là một ý tưởng tồi tệ. stackoverflow.com/q/2091284/27535
gbn

@gbn có suy nghĩ gì về câu trả lời gần đây của Justin cho câu hỏi đó không? Có vẻ như hơi mâu thuẫn với của bạn.
AakashM

@AakashM: anh ấy nói đúng về dung lượng lưu trữ nhưng đó là chi phí chung chứ không phải tối ưu hóa. Bây giờ hãy đọc stackoverflow.com/q/2009694/27535
gbn 22/09/11

@gbn - điểm tốt, cũng như quan sát của Martin Smith về lập chỉ mục. Đã rút tiền.
StuartLC

2
Hóa ra cuối cùng đã có một món quà! Trường đã được lập chỉ mục và khi ai đó cố gắng nhập một mục lớn hơn 900b, nó không thành công! Được cảnh báo.
Paul T Davies

Câu trả lời:


59

Đây chỉ là thay đổi siêu dữ liệu: nó nhanh chóng.

Một quan sát: chỉ định rõ ràng NULL hoặc NOT NULL để tránh "tai nạn" nếu một trong các cài đặt SET ANSI_xx khác nhau, ví dụ như chạy trong osql không phải SSMS vì một số lý do


1
Tất cả đều ổn với điều này. Không vấn đề gì.
Paul T Davies

Bạn có biết nếu các quy tắc tương tự áp dụng khi đi từ varchar(200)đến varchar(max)?
CodeNaked

@CodeNaked: câu này khó trả lời hơn rất nhiều. (max) là loại LOB có thể nằm "trong hàng" hoặc ngoài hàng. Tuy nhiên, tôi có xu hướng nói rằng nó phải giống nhau vì dữ liệu đã ở "hàng" và không cần xây dựng lại bảng
gbn

12

Tôi chỉ muốn thêm 2 xu của mình, vì tôi đã tìm kiếm câu hỏi này. B / c tôi thấy mình đang ở trong tình huống tương tự ...

NHẬN THỨC rằng mặc dù thay đổi từ varchar(xxx)thành thực sự varchar(yyy)là một thay đổi siêu dữ liệu, nhưng chuyển sang varchar(max)thì không. Vì varchar(max)các giá trị (hay còn gọi là giá trị BLOB - hình ảnh / văn bản, v.v.) được lưu trữ khác nhau trên đĩa, không phải trong một hàng của bảng mà là "ngoài hàng". Vì vậy, máy chủ sẽ hoạt động trên một bảng lớn và không phản hồi trong vài phút (giờ).

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

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

Tái bút. tương tự áp dụng cho nvarcharhoặc khóa học.


4

Thay đổi thành Varchar (1200) từ Varchar (200) sẽ không gây ra vấn đề gì cho bạn vì nó chỉ là một thay đổi siêu dữ liệu và vì SQL server 2008 cắt bớt các khoảng trống cần thiết, bạn cũng sẽ không thấy sự khác biệt về hiệu suất, vì vậy, tóm lại sẽ không có vấn đề gì với việc tạo thay đổi.


Tôi tin rằng điều này có thể đúng với các bảng nhỏ, nhưng đối với các bảng lớn đang được truy vấn tích cực, điều này có thể chặn trong một khoảng thời gian đáng kể (vì máy chủ SQL cần xem liệu nó có cần cắt bớt mọi hàng hay không).
CodeNaked

0

Một lý do khác tại sao bạn nên tránh chuyển đổi cột thành varchar (max) là vì bạn không thể tạo chỉ mục trên cột varchar (max).


-3

Trong trường hợp của tôi, cột thay đổi không hoạt động nên người ta có thể sử dụng lệnh 'Sửa đổi', như:

thay đổi bảng [tên_bảng] MODIFY cột [tên_mục] varchar (1200);


5
Đó là bởi vì bạn không sử dụng SQL Server theo câu hỏi (có thể là MySQL). "ALTER TABLE ... MODIFY" không phải là T-SQL hợp lệ.
Jeroen Mostert
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.