#sql-server #database
#sql-server #База данных
Вопрос:
У меня есть таблица с довольно большим количеством строк (более 300 000 000). Я хочу удалить not null ограничение для одного из столбцов, выполнив следующий SQL-запрос, пока база данных все еще находится под нагрузкой (поскольку таблица большая, это может занять около 10 минут):
ALTER TABLE DECLARATION
ALTER COLUMN LOCAL_REFERENCE_NUMBER VARCHAR(22) NULL WITH (ONLINE = ON);
Я ожидаю, что этот ONLINE = ON
параметр гарантирует, что таблица не будет заблокирована во время обновления, чтобы убедиться, что приложения, использующие базу данных, все еще могут это делать во время обновления.
Однако в документах говорится, что ONLINE = ON
это применимо только для добавления и удаления индексов, а также первичных ключей или уникальных ограничений, т. Е., Как видно из официальной документации, этот параметр не влияет на not null ограничения.
Это действительно так, или документация просто не заполнена? Если это так, что такого особенного в удалении not null ограничений, что это невозможно сделать онлайн?
Спасибо.
Комментарии:
1. Я думаю, у вас все не так. Вы не можете указать параметр, потому что это бессмысленно , а не потому, что операция не может быть выполнена «онлайн». Насколько я помню, на самом деле это операция только с метаданными, поэтому она даже не касается таблицы.
2. @Damien_The_Unbeliever, означает ли это, что если я хочу, скажем, удалить индекс, я могу сделать это онлайн, но если я хочу удалить not null ограничение, я не могу сделать это онлайн, поэтому я должен остановить свои приложения?
3. ..@yaskovdev .. тип данных столбца тоже изменен / изменен?
4. @lptr, нет, тип данных остался прежним.
5. ..@yaskovdev… это зависит от типа данных. ненулевые столбцы фиксированного размера хранятся в части строки данных фиксированного размера (левая сторона). переменные размера хранятся в части с переменным размером (справа). Поскольку столбец уже имеет тип данных переменного размера (varchar) .. тогда он уже сохранен в переменной части строки, и изменение обнуляемости не требует каких-либо изменений данных. Если столбец был char not null, то изменение на varchar должно было бы изменить порядок каждой строки на страницах данных.
Ответ №1:
Как указано в разделе commment, эта операция должна быть только операцией с метаданными (если не произошло изменений типа данных):
ALTER TABLE DECLARATION
ALTER COLUMN LOCAL_REFERENCE_NUMBER VARCHAR(22) NULL;
Это можно проверить, установив расширенный сеанс событий и наблюдая sqlserver.compressed_alter_column_is_md_only
событие (SQL Server 2016 )