如何加快列在Sql Server中的大型表

我想添加一列到大约10M行Sql Server表。 我认为这个查询最终会添加我想要的列:

alter table T add mycol bit not null default 0 

但已经有好几个小时了 是否有任何捷径,以获得一个“非空默认0”列插入到一个大型的表? 或者这本质上真的很慢?

这是Sql Server 2000.稍后我必须在Sql Server 2008上做类似的事情。

根据你的行大小,表大小,索引等,我已经看到SQL Server 2000在最后完成之前磨了好几个小时(4-5小时)。

现在可以做的最糟糕的事情就是“恐慌”,并且很难杀死这个东西。 让它自行摆脱。

将来,您可能希望尝试Farseeker提到的内容,并创build第二个(空的)结构,并以这种方式复制您的logging。

  • 表行越长,需要的时间越长。
  • 你在桌上的索引越多,需要的时间就越长。
  • 如果你添加一个默认值(你所做的),这将花费更长的时间。
  • 如果您在服务器上的使用率很高,则需要更长的时间。
  • 如果您不locking该数据库或将其置于单用户模式,则需要更长的时间。

当我必须做这样的丑陋的东西,我试着在晚上做…像2点上没有人时(和主要不在服务器上运行)。

祝你好运! 🙂

嗯,10M行是一个很less的,但它不在MSSQL的领域之外,这似乎很慢。

我们有一个巨大的行大小(devise不佳)和超过10M行的表。 当我们不得不修改结构时,它是def。 非常缓慢,所以我们所做的是(让桌面保持在线状态,这是很久以前的记忆):

  • 用后缀“C”(用于转换)和新结构(即与旧的相同,但用新的列/索引/等)创build新的表格,
  • SELECT * INTO tableC FROM表
  • sp_rename'table''tableOld'
  • sp_rename'tableC''表'

这样,转换花费多less时间并不重要,因为旧数据在线。 这可能会导致行被写入到表中,但转换发生时会出现问题(这对于我们来说不是问题,因为数据只能每天写入一次,而是每小时查询数千次),因此您可能需要调查。

您可以尝试在单独的批次中执行操作的每个步骤,例如

 alter table T add mycol bit null go update T set mycol = 0 go alter table T alter column mycol bit not null go alter table T add default 0 for mycol go 

优点是:

  • 您可以获得更好的操作进度反馈,因为现在有四个不同的批次,每个批次大概需要四分之一的时间。
  • 它从客户端代码运行时减less了超时错误的可能性。
  • 我发现它有时会提高性能。

在进行更改之前,您还可以尝试删除表上的所有非聚簇索引,然后再恢复它们。 添加列可能涉及大规模的页面拆分或其他低级重新安排,并且可以在没有更新非集群索引的情况下进行。

这将需要相当长的一段时间。 因为你正在添加默认值。 这导致SQL Server更新单个事务中的所有行。 确保没有其他人使用该表格,因为这会导致您的stream程被阻止。

我在一张至less有六千五百万行的桌子上做了类似的事情,而且没有那么长时间。 磁盘系统中是否有足够的内存和足够的性能?

如果要加快进程速度,可以在更改表之前删除所有索引execpt聚簇索引和外键约束,但必须在系统不使用时完成,否则可能会得到不一致的数据。 但最后,在完成之前,您需要应用外键和索引,但是您将缓解事务日志的痛苦,至less在简单恢复模式下运行时是如此。 而在SQL Server 2008中,您可以使用ONLINE = on和SORT_IN_TEMPDB = on构build索引

HåkanWinther

你并不是真的想要这样的快捷方式 – 不pipe你做什么,SQL Server将不得不在表中的所有行上进行一些处理。

您可以通过确保您的数据文件和日志位于单独的驱动器上以及其他常用的build议来确保其运行速度尽可能快。

10m行的时间太长了。 检查桌子上是否有锁打开。

在一次培训课程中,我与来自国防部的几位DBA进行了交谈。 他们pipe理100TB以上的MySQL数据库。 表格更改是通过转储和加载完成的,但显然需要一些停机时间。 他们还提到他们不喜欢在10TB以上的数据库上做这个,因为花费了时间。

数据被转储,他们没有指定什么,但我会假设SQL文件。 然后将表格截断并根据需要更改模式。 数据然后重新加载。

你碰巧有几个索引你的表,甚至可能是你的表T上的聚集索引?

我也有问题添加一个新的列(这是一个身份列)。 该表有930万行,主键上有一个非聚集索引。

出于某种原因,如果我们删除表T的索引 ,请按照添加列的方式,然后添加表T的索引。它在标准SQLServer 2008上基本上快了60倍。

我还没弄明白为什么这么快就加速了,希望有人能给我这个答案。