2012-03-29 60 views
3

我有一个数据库表,它拥有数百万行的客户数据,并且需要将NVARCHAR(32)中的姓氏字段修改为NVARCHAR(50)。该字段上有一个索引(非集群)。我需要知道使用ALTER TABLE ALTER COLUMN语句进行此更改是否会自动重建索引。在SQL Server中增加NVARCHAR列的大小会导致索引重建吗?

如果是这样,我认为这将需要相当多的时间。我们的生产升级过程是通过运行脚本的已发布安装程序完成的,我们需要预计升级需要多长时间。我们在SQL 2005和2008两个版本中都有相当大的数据库生产,所以如果不同,我需要知道两者的答案。

我知道,增加列的大小不应修改像NVARCHAR这样的可变长度字段中的数据,即使在没有索引涉及的情况下,即使在大型数据集上也应该很快。我不清楚的是索引是否会导致速度变慢。

我在下面的链接中阅读文档,但它确实只是表明您可以使用现有索引进行更改,并且不指定对ALTER TABLE语句的执行时间可能产生的影响,或者索引是否之后必须重建,或者是自动完成的,等

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

在下面的链接真正的问题是几乎我问这里同样的事情,但没有令人满意的答案在这其他职位,所以我想我会尝试一个新的职位。

SQL Server 2005 Index rebuild when increasing the size of a varchar field

请让我知道,如果你有这方面的经验。如果我可以在一个可以实验的大型数据库中建立一个测试系统,我会公布结果。

谢谢!

+0

我不相信索引需要重建,如果你所做的只是增加大小。除非你增加*和*在表中有'NULL'*和*将定义改为NOT NULL *和*添加一个大于旧的大小的默认值,否则不会改变行,因此索引中的数据不会改变。但你可以肯定地测试这个*没有*创建一个“可观的数据库”... – 2012-03-29 15:26:18

+0

好吧,很酷。你提到的那些东西都不适用于我的情况。在我需要修改的列上没有定义NOT NULL约束或DEFAULT值。我想我会做什么来测试语句执行时间是否受到影响,是创建两个表,每个表都有一个VARCHAR(50)列,可以用一个简单的脚本填充。我可以在一个表上放置一个索引,而在另一个表上不放入索引,并且当它们具有相同的数据并且唯一的区别是索引时,将每个表的列更改为VARCHAR(100)的时间需要多长时间。 – Jim 2012-03-29 15:48:33

+0

在更改之前和之后查询sys.dm_db_index_physical_stats可能还会显示是否进行了重大更改。 – 2012-03-29 17:06:39

回答

3

否 - 即使在更改列大小(如所提及的nvarchar列)时,也不会在SQL Server中自动重建索引。索引是自动维护的,但不能重建。如果数据库选项的“自动更新统计信息”已设置,则数据的统计/内部直方图可能会自动更新。

相关问题