Додавання стовпців до виробничих таблиць


28

Який найкращий спосіб додати стовпці до великих виробничих таблиць на SQL Server 2008 R2? Згідно з книгами Microsoft в Інтернеті:

Зміни, зазначені в ALTER TABLE, вводяться негайно. Якщо для змін потрібні зміни рядків у таблиці, ALTER TABLE оновлює рядки. ALTER TABLE отримує блокування модифікації схеми на столі, щоб переконатися, що під час зміни немає інших посилань на посилання навіть на метадані для таблиці, за винятком онлайнових операцій з індексом, які потребують дуже короткого блокування SCH-M в кінці.

(http://msdn.microsoft.com/en-us/library/ms190273.aspx)

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


1
Останні статті про цю проблему: sqlservercentral.com/articles/Change+Tracking/74397
8KB

Відповіді:


27

"Це залежить"

Якщо додати стовпчик, який не потребує додавання даних до рядків, це може бути досить швидким.

Наприклад, додавання int або char вимагає фізичних рухів рядків. Додавання змінного варшара без типових налаштувань не повинно (якщо тільки растровий файл NULL не потрібно розширювати)

Вам потрібно спробувати його на відновленій копії виробництва, щоб отримати оцінку

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

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

Я сказав, щоб спершу взяти резервну копію?


2
+1 на резервній копії. і переконайтеся, що у вас також є достатньо місця для журналу.
SqlACID

Чи можете ви уточнити, чому для додавання int чи char потрібні фізичні рухи рядків?
sh-beta

5
Ви мали на увазі, що "не вимагає" додавання даних до рядків у другому рядку?
Бен Брокка

21

Якщо стовпець NULLable, вплив повинен бути незначним. Якщо стовпець не може бути NULL і значення потрібно встановити, то воно може бути зовсім іншим. Що я б робив у цьому випадку, це замість того, щоб додавати ненулеві обмеження та обмеження за замовчуванням в один кадр, ефективно додаючи дані до кожного рядка:

  • додайте стовпчик як NULLable - у більшості випадків має бути швидким
  • оновити значення за замовчуванням
    • Ви можете це зробити партіями, якщо це необхідно
    • Ви також можете використовувати це для застосування умовної логіки, де деякі рядки можуть не отримати за замовчуванням
  • додати ненульові / за замовчуванням обмеження
    • це буде швидше, коли жодна з даних не буде NULL, але все ж повинна бути вимірюваною

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


Знову останній біт: •add the not null/default constraintsя не впевнений, що з цим не існує потенційної проблеми ... Коли MSSQL (навіть 2008R2) змінює стовпчик, що не є нульовим, на нульовий, якщо ви вкладете слід, ви побачите його насправді під кришками роблячи повне оновлення кожного рядка таблиці, тобто update table1 set column1 = column1я припускаю, що це робить недійсну перевірку абсолютно ідіотським способом. Ця транзакція вдвічі перевищує розмір таблиці (до і після сторінок), тому для таблиці DW може бути величезна кількість. Раніше нам доводилося вилучати дані

Якщо хтось знає спосіб цього, я люблю знати ... На відміну від цього, в Oracle зміна null на null робить блокування, а потім вибір, щоб перевірити відсутність ненульових значень, а потім миттєве оновлення мета даних.

Привіт @Mike, це звучить як хороший потенційний питання сам по собі.
Дерек Дауні

4

Чи вважали ви:

  1. Створення нової таблиці, яка включає зміни у визначенні таблиці.
  2. Вставлення в нове визначення таблиці, вибране з вихідної таблиці.
  3. Перейменування оригінальної таблиці на _orig, а потім перейменування нової таблиці у вихідну назву таблиці.

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

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


Ви б не потрібна запис блокування, а не читати? Користувачі прекрасно бачать дані в старій таблиці, ви просто не хочете, щоб вони вносили будь-які зміни, які були б перезаписані, коли ви закінчите заміну буфера.
Джон з усіх торгів

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