【发布时间】:2012-03-29 15:18:48
【问题描述】:
我有一个数据库表,其中包含数百万行的客户数据,并且需要将 lastname 字段从 NVARCHAR(32) 修改为 NVARCHAR(50)。该字段上有一个索引(非聚集)。我需要知道使用 ALTER TABLE ALTER COLUMN 语句进行此更改是否会自动重建索引。
如果是这样,我认为这需要相当长的时间。我们在生产中的升级过程是通过运行脚本的已发布安装程序完成的,我们需要对升级需要多长时间做出预期。我们在 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
如果您有这方面的经验,请告诉我。如果我可以建立一个测试系统,其中包含一个可以进行实验的大型数据库,我会发布结果。
谢谢!
【问题讨论】:
-
如果您所做的只是增加大小,我认为不需要重建索引。除非您增加大小并且现在表中有
NULLs并且将定义更改为NOT NULL并且添加一个默认值大于旧大小,则不会更改任何行,因此索引中的数据不会更改。但是您当然可以在创建“相当大的数据库”的情况下测试它... -
好的,很酷。你提到的这些都不适用于我的情况;在我需要修改的列上没有定义 NOT NULL 约束或 DEFAULT 值。我想我要做的就是测试语句执行时间是否受到影响是创建两个表,每个表都有一个 VARCHAR(50) 列,可以用一个简单的脚本填充。我可以在一个表上放置索引,而在另一个表上不放置索引,并计算当每个表具有相同数据且唯一区别是索引时将列更改为 VARCHAR(100) 所需的时间。
-
在更改前后查询 sys.dm_db_index_physical_stats 也可能显示是否进行了重大更改。
标签: sql sql-server sql-server-2008 sql-server-2005 ddl