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


14

在我们的数据库中,存在一个或多或少如下所示的大表:

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

但是现在串行字段的大小已经变小,因此我想将其更改为32。VisualStudio架构比较工具建议通过以下方式进行操作:

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万行,我想重新创建索引将花费相当长的时间),因为下一个维护窗口将在未来几个月内进行。我有什么选择?

Answers:


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-我认为对于不需要的情况,这只是一个缺少的优化。在线书籍表明,在某些情况下,直到此更新之前
Martin Smith
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.