sql-server – 更改nvarchar列的大小时,是否需要删除唯一索引?并且在重新创建索引时表会被锁定吗?

在我们的数据库中存在一个大表,或多或少看起来像这样:

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);

这真的需要吗?或者更像是一种超省的方式吗?

另外,当重新创建唯一索引时,我的表会被锁定吗?因为这将是一个大问题(因为该表有3000万行,我猜想重新创建索引需要相当长的时间),因为下一个维护窗口是未来几个月.
我有什么选择?

最佳答案
无需删除并重新创建索引.

只是用

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

这是仅元数据的更改.

将列从NVARCHAR(16)更改为NVARCHAR(32)根本不会影响存储.

反之亦然(从NVARCHAR(32)到NVARCHAR(16))会给你一个关于依赖于列的对象的错误,因此Visual Studio可能总是生成该锅炉板代码而不是检查它是否真的需要.

转载注明原文:sql-server – 更改nvarchar列的大小时,是否需要删除唯一索引?并且在重新创建索引时表会被锁定吗? - 代码日志