2016-05-31 40 views
0

我有一个45M行(45 GB数据空间和2GB索引空间)的表。我添加了一个新列,并立即完成。改变列大小需要很长时间?

alter table T add C char(25) 

然后我发现大小太小,所以我运行以下查询。

alter table T alter column C varchar(2500) 

它运行了一个小时,仍在运行。 sp_whoisactive显示(目前仍在运行)

reads: 48,000,000 
writes: 5,000,000 
physical reads: 3,900,000 

它不是很快吗?

+0

你可能会在[DBA.SE]一个更好的答案(http://dba.stackexchange.com) – DaveShaw

+1

答案是:不是,不。 –

+1

将列添加到表的末尾几乎是瞬间的,如果更改现有列的大小,则需要重建表和可能的索引 – JVC

回答

1

我测试了案例。你可以做得更快使用下面的步骤:

  1. 使用不同的名称(称之为TBL2)
  2. 阿尔特上TBL2列从TBL1
  3. 将数据插入TBL2
  4. 删除创建相同的表结构TBL1(旧表)
  5. 重命名TBL2(新一)以TBL1

这会给你更好的性能。

原因是,改变包含数据的表上的列,将需要大量的数据传输和数据页面对齐。 使用我的解决方案,您只需插入任何页面重组的数据。

如果帖子回答您的问题,请注明是答案