Під час зміни розміру стовпчика nvarchar мені потрібно скидати унікальний індекс? І чи заблокується таблиця при відтворенні індексу?


14

У нашій базі даних існує велика таблиця, яка більш-менш виглядає так:

CREATE TABLE dbo.production_data
(
    pd_id BIGINT PRIMARY KEY,
    serial NVARCHAR(16) NOT NULL UNIQUE,
    ...
);

але тепер розмір послідовного поля став низьким, тому я хочу змінити його на 32. Інструмент порівняння схеми Visual Studio пропонує зробити це шляхом:

DROP INDEX ux_production_data_serial ON dbo.production_data;
GO
ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL;
GO
CREATE INDEX ux_production_data_serial ON dbo.production_data(serial ASC);

Це справді потрібно? Або більше схожий на ультразберігаючий спосіб зробити це?

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

Відповіді:


24

Не потрібно скидати та відтворювати індекс.

Просто використовуйте

ALTER TABLE dbo.production_data
  ALTER COLUMN serial NVARCHAR(32) NOT NULL; 

Це лише метадані.

Змінення стовпця від NVARCHAR(16)на NVARCHAR(32)зовсім не впливає на сховище.

Якщо піти в інший бік (від - NVARCHAR(32)до NVARCHAR(16)), ви отримаєте помилку щодо того, що об'єкти залежать від стовпця, але, можливо, Visual Studio просто завжди генерує код котлової пластини замість того, щоб перевірити, чи він насправді потрібен.


2
Цікаво, чому Visual Studio сценаріює це як DROP / CREATE INDEX. Можливо, непотрібний, безумовний CYA.
Аарон Бертран

2
@AaronBertrand - Я вважаю, що це просто відсутня оптимізація для тих випадків, коли вона не потрібна. Книги в Інтернеті вказували, що це потрібно в кількох випадках, коли продукт фактично не потребував його також до цього оновлення
Мартін Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.