Який найефективніший спосіб змінити визначення стовпця в таблиці з мільйонами рядків


9

Мені потрібно змінити стовпець з NOT NULL на NULL у таблиці, що містить мільйони рядків. Я спробував простий

alter table Table1 ALTER COLUMN Column1 XML NULL

але це вічно. Тож ось мої запитання:

  1. Чому застосувати альтер так довго?
  2. Чи є кращий спосіб це зробити?

Відповіді:


3

1) Вам знадобиться додаткова інформація про повну структуру таблиці + некластеризовані індекси, щоб правильно зрозуміти, що відбувається, але я підозрюю, що це стосується растрової карти NULL.

Будь ласка, зверніться до докладнішої інформації по темі. http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-null-bitmap-size.aspx

http://www.sqlskills.com/BLOGS/PAUL/post/A-SQL-Server-DBA-myth-a-day-(630)-three-null-bitmap-myths.aspx

2) Так, за умови, що у вас є місце для зберігання, створіть нову таблицю з правильною нульовістю та перенесіть дані декількома партіями, щоб уникнути надмірного зростання журналу та переключіть таблицю, використовуючи наведену нижче техніку. Я робив це декілька разів, мало взагалі простоїв.

http://jahaines.blogspot.com/2009/12/sql-server-2005-how-to-move-10-millions.html


6

Чи буде швидше:

  1. Створіть нову таблицю з правильним визначенням для Column1
  2. INSERT INTO <NewTable> SELECT * FROM <OriginalTable>;
  3. Перейменуйте OriginalTable на OriginalTable_old; Перейменуйте NewTable на OriginalTable
  4. Перевірка та відкидання OriginalTable_old

Перевага тут полягає в тому, що ви не тримаєте блокування в таблиці «Оригінал» протягом тривалості операції. Таблиця повинна бути заблокована лише під час фази перейменування. (Передбачається, що SQL Server підтримує перейменування рівня об'єкта.)


Так, SQL Server підтримує перейменування об'єктного рівня, використовуючи процедуру, що зберігається в системі sp_rename.
gonsalu

Я зміг змінити стовпець за допомогою 3,5-рядкових рядків протягом 1 хвилини.
Мохсен Афшин

2

Кожен рядок потрібно торкатися, змінюючи стовпець з NOT NULL на NULL, тому його заповнення займає так багато часу. Немає жодного способу змусити це зайняти менше часу.


1

Інший варіант - створити новий стовпець з правильним визначенням до відповідної таблиці, оновити стовпчик даними зі старого стовпця, а потім скинути старий стовпець.

Або ви можете посилатися на старіший пост від SE, який розглядає подібне питання у колонці INT.

/programming/4311559/sql-server-performance-for-alter-table-alter-column-change-data-type


У моєму випадку мій стовпець просто заповнений NULLs, тому я думаю, що це був би шлях. Створення нового повністю стовпця NULL з правильною назвою не повинно зайняти часу ... потім видалення старого стовпця, замість того, щоб мати справу з мільйонами вставок ...
Зак,

0

Якщо ви відкриєте монітор активності SQL під час виконання команди, ви зможете сказати, чи реально вона обробляє її, чи очікує вона на якусь форму ексклюзивного блокування таблиці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.