При збільшенні розміру стовпця VARCHAR на великій таблиці можуть виникнути проблеми?


87

Я використовую SQL Server 2008, і мені потрібно збільшити поле VARCHAR, від (200 до 1200) у таблиці приблизно з 500 тис. Рядків. Мені потрібно знати, якщо є якісь питання, які я не розглядав.

Я буду використовувати цей вираз TSQL:

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

Я вже спробував його на копії даних, і це твердження не мало негативних наслідків, які я міг побачити.

То чи є можливі проблеми з цим, які я, можливо, не враховував?

До речі, стовпець не індексується.


1
@nonnb: це жахлива ідея. stackoverflow.com/q/2091284/27535
ГБН

@gbn будь-які думки щодо нещодавньої відповіді Джастіна на це питання? Здається, дещо суперечить вашому.
AakashM

@AakashM: він правильно ставиться до сховища, але це накладні витрати, а не оптимізація. Тепер прочитайте цю stackoverflow.com/q/2009694/27535
ГБН

@gbn - хороший момент, як і спостереження Мартіна Сміта щодо індексації. Вилучено.
StuartLC

2
Виявляється, врешті-решт, було одне причуття! Поле було проіндексовано, і коли хтось намагався ввести запис, більший за 900b, воно не вдалося! Будьте попереджені.
Paul T Davies

Відповіді:


59

Це лише зміна метаданих: це швидко.

Спостереження: явно вкажіть NULL або NOT NULL, щоб уникнути "аварій", якщо один із параметрів SET ANSI_xx відрізняється, наприклад, запустити в osql, а не SSMS з якихось причин


1
З цим все пройшло нормально. Немає проблем.
Paul T Davies

Чи знаєте ви, чи застосовуються однакові правила при переході з varchar(200)до varchar(max)?
CodeNaked

@CodeNaked: на це набагато складніше відповісти. (max) - тип LOB, який може бути "в рядку" або поза ним. Однак я схильний сказати, що це повинно бути однаковим, тому що дані вже "в рядку", і не потрібно буде перебудовувати таблиці
gbn

12

Просто хотів додати свої 2 центи, оскільки я погуглив це питання 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або курсу.


4

Перехід на Varchar (1200) з Varchar (200) не повинен викликати жодних проблем, оскільки це лише зміна метаданих, а оскільки SQL Server 2008 скорочує надмірні порожні пробіли, ви також не бачите різниці в продуктивності, тому, коротше кажучи, проблем із створенням змінити.


Я вважаю, що це може бути справедливим для маленьких таблиць, але для великих таблиць, які активно запитуються, це може блокувати на значний час (оскільки SQL-сервер повинен перевірити, чи потрібно йому усікати кожен рядок).
CodeNaked

0

Інша причина, чому вам слід уникати перетворення стовпця у varchar (max), полягає в тому, що ви не можете створити індекс у стовпці varchar (max).


-3

У моєму випадку стовпець alter не працював, тому можна використовувати команду 'Змінити', наприклад:

змінити таблицю [ім'я_таблиці] MODIFY стовпець [ім'я_столбця] varchar (1200);


5
Це тому, що ви не використовуєте SQL Server для запитання (але, ймовірно, MySQL). "ALTER TABLE ... MODIFY" не є дійсним T-SQL.
Jeroen Mostert
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.