Збільшити стовпчик зміни швидкості на великій таблиці до NON NULL


12

Нещодавно я додав бітовий стовпець, що підтримує NULL, до таблиці, що має близько 500 мільйонів рядків. У стовпці немає за замовчуванням, проте всі вставки вказують значення 0 або 1, і я запустив одноразову процедуру, щоб призначити 0 або 1 всім існуючим рядкам (оновлення рядків невеликими партіями). Кожен рядок повинен мати 0 або 1 у цьому стовпці.

Я хочу зробити бітовий стовпчик ненульовим, проте коли я спробував це зробити через ALTER TABLE t1 ALTER COLUMN c1 bit not null, він почав працювати протягом 3 хвилин, і я зупинив його, оскільки він блокував усі записи до таблиці, і я підозрював, що це займе багато часу для завершення . Можливо, це займе не так довго, але я не міг ризикувати занадто сильно. Сам відкат зайняв 6 хвилин.

Чи є у вас пропозиції щодо того, як я можу зробити стовпчик ненульовим, не потребуючи часу на його завершення? Окрім того, чи є можливість оцінити, скільки часу ALTER TABLE ALTER COLUMNзаява, яку я почала та потім скасувала, потребуватиме завершення?

Я використовую веб-версію SQL Server 2017.

Відповіді:


12

Замість зміни визначення стовпця ви можете додати значення CHECK CONSTRAINT, яке не дозволяє NULL для цього стовпця. Таблицю ще потрібно буде сканувати, але не потрібно змінювати кожну окрему сторінку даних, тому операція повинна бути набагато швидшою. На жаль, замок Sch-M все ще буде триматися під час роботи. Один фокус - спробувати ввести якомога більше таблиці в буферний пул, перш ніж намагатися додати обмеження. Це може скоротити час утримання замка Sch-M.

Потім можна видалити обмеження та змінити визначення стовпця під час наступного вікна обслуговування.


Дякую Джо за ідею. Я майже пішов із додаванням обмеження для перевірки, але мав вікно технічного обслуговування протягом вихідних і зміг змінити стовпчик на нерегульований. Я не впевнений, чи допомогло це, але спробувати повернути дані таблиці в буферний пул, безпосередньо перед тим, як зробити стовпчик ненульовим, я пробіг, на SELECT c1, count(*) FROM t1 GROUP BY c1що запустив близько 9 хвилин. Після ALTER TABLE ALTER COLUMNзакінчення фактичної заяви було потрібно 25 хвилин. Не дуже погано.
Ben Amada

11

Якщо ви працюєте на Enterprise Edition (EE), кращою стратегією було б додати її як NOT NULLза замовчуванням 0або 1(що найчастіше зустрічається).

Це лише зміни метаданих у EE . Потім оновіть ті, які потрібно перевернути. Це означає менше оновлень і не потрібно змінювати нульовість стовпців, коли закінчите. - мартін-коваль


Цікаво, що я помітив цю функцію минулого тижня, коли я тестував додавання ненульового бітового стовпчика зі значенням за замовчуванням до цієї самої великої таблиці на моїй локальній машині, на якій працює версія SQL для розробників - стовпець додався миттєво, і я не міг зрозуміти, чому . Пізніше він мені, що це повинно бути, тому що видання розробника включає функції EE.
Бен Амада

-3

Спробуйте скопіювати дані в нову таблицю, а потім перейменуйте її. Ви повинні подбати про будь-які обмеження та індекси. Ось що робить дизайнер таблиць SSMS, коли ви хочете змінити порядок стовпців (наприклад), але слід перевірити сценарій, щоб побачити, чи є щось, що не виглядає правильно.

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

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