Могут ли возникнуть проблемы при увеличении размера столбца 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

@gbn есть какие-нибудь мысли по поводу недавнего ответа Джастина на этот вопрос? Кажется, несколько расходится с твоим.
AakashM

@AakashM: он прав насчет хранилища, но это накладные расходы, а не оптимизация. Теперь прочтите этот stackoverflow.com/q/2009694/27535
gbn

@gbn - хороший момент, как и наблюдение Мартина Смита об индексировании. Снято.
StuartLC

2
Оказывается, в итоге была одна проблема! Поле было проиндексировано, и когда кто-то пытался ввести запись размером более 900b, это не удалось! Имейте в виду.
Пол Т. Дэвис

Ответы:


59

Это только изменение метаданных: это быстро.

Наблюдение: явно укажите NULL или NOT NULL, чтобы избежать «аварий», если одна из настроек SET ANSI_xx отличается, например, запускать в osql, а не в SSMS по какой-то причине


1
Все прошло нормально. Без проблем.
Пол Т. Дэвис

Вы знаете, применяются ли те же правила при переходе из пункта 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-сервер 2008 усекает слишком много пустых пространств, вы также не должны видеть никаких различий в производительности, поэтому, короче говоря, не должно быть проблем с созданием изменение.


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

0

Еще одна причина, по которой вам следует избегать преобразования столбца в varchar (max), заключается в том, что вы не можете создать индекс для столбца varchar (max).


-3

В моем случае столбец изменения не работал, поэтому можно использовать команду «Изменить», например:

изменить таблицу [имя_таблицы] ИЗМЕНИТЬ столбец [имя_столбца] varchar (1200);


5
Это потому, что вы не используете SQL Server в соответствии с вопросом (но, вероятно, MySQL). «ALTER TABLE ... MODIFY» не является допустимым T-SQL.
Jeroen Mostert
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.