【问题标题】:Does increasing an NVARCHAR column size in SQL Server cause index rebuild?在 SQL Server 中增加 NVARCHAR 列大小会导致索引重建吗?
【发布时间】: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


【解决方案1】:

否 - SQL Server 中永远不会自动重建索引,即使您更改列大小(例如提到的 nvarchar 列)也是如此。索引会自动维护,但不会重建。如果设置了 DB 选项“自动更新统计”,则数据的统计/内部直方图可能会自动更新。

【讨论】:

    猜你喜欢
    • 2011-04-21
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多