Изменение 2 столбцов в таблице - рискованная операция? - PullRequest
2 голосов
/ 04 ноября 2010

У меня есть таблица с ~ 100 столбцами, около ~ 30M строк, на MSSQL server 2005.

Мне нужно изменить 2 столбца - изменить их типы с VARCHAR (1024) на VARCHAR (макс.).Эти столбцы не имеют индекса.

Я обеспокоен тем, что при этом заполнится журнал и произойдет сбой операции.Как я могу оценить необходимое свободное дисковое пространство, как данные, так и журнал, необходимые для такой операции, чтобы убедиться, что она не выйдет из строя?

Ответы [ 4 ]

1 голос
/ 04 ноября 2010

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

  1. Добавить новый столбец типа VARCHAR(MAX) NULL.Как обнуляемый столбец, будет добавляться только как метаданные (без обновления данных)
  2. Скопировать данные из старого столбца в новый столбец.Это можно сделать партиями, чтобы уменьшить давление в журнале.
  3. Удалите старый столбец.Это будет операция только с метаданными.
  4. Используйте sp_rename, чтобы переименовать новый столбец в старое имя столбца.
  5. Позже, для вашего удобства, перестройте кластеризованный кластер.индекс (при необходимости, в Интернете), чтобы избавиться от места, занимаемого старым столбцом

Таким образом, вы получаете контроль над журналом, контролируя пакеты на шаге 2).Вы также минимизируете нарушение разрешений, ограничений и отношений, не копируя всю таблицу в новую (как это плохо делает SSMS ...).

Вы можете выполнить эту последовательность сразу для обоих столбцов.

1 голос
/ 04 ноября 2010

Почему увеличение лимита VARCHAR заполняет журнал?

1 голос
/ 04 ноября 2010

Я бы порекомендовал вам рассмотреть вместо этого:

  1. Создать новую таблицу с новой схемой
  2. Копировать данные из старой таблицы в новую таблицу
  3. Оставить старый стол
  4. Переименовать новую таблицу в имя старой таблицы

Это может быть гораздо менее дорогостоящей операцией и может быть выполнено с минимальным ведением журнала с использованием INSERT / SELECT (если это был SQL Server 2008 или выше).

0 голосов
/ 04 ноября 2010

Попробуйте сделать несколько тестов меньшими кусочками.Я имею в виду, что вы можете создать одну и ту же структуру локально с несколькими тысячами строк и увидеть разницу до и после.Я думаю, что изменение будет линейным.На самом деле вопрос в том, чтобы повторить журнал, вписывается ли он в него или нет, так как вы можете сделать это сразу.Должны ли вы сделать это онлайн, или вы можете на некоторое время остановить производство?Если вы можете остановиться, возможно, есть способ остановить журнал повторов в MSSQL, как в Oracle.Это может сделать это намного быстрее.Если вам нужно сделать это онлайн, вы можете попытаться создать новый столбец, скопировать в него значение с помощью цикла, например, 100000 строк одновременно, зафиксировать, продолжить.После завершения, возможно, удалить оригинальный столбец и переименовать новый быстрее, чем изменить.

...