添加列花费的时间太长

Str*_*ped 5 sql-server-2008 sql-server

我正在尝试向数据库添加一列。查询已经运行了 25 分钟,它锁定了对该表的 Web 访问并破坏了我们的网站:

alter table MyTable
add MyNewColumn varchar(max) not null
default ('')
Run Code Online (Sandbox Code Playgroud)

该表在不同的列中包含二进制数据并且非常大。

使用红色的“取消执行查询”按钮取消会导致其他问题吗?我只是想弄清楚此时是否应该尝试取消查询,以及它运行了这么长时间后会发生什么。

Rem*_*anu 7

你的方法有几个问题:

  • 添加具有默认值的非空MAX列。使列可以为空并且不指定默认值。添加默认的 '' 而不是让它可以为空在语义上是不正确的,并且每行浪费了大量空间。让您的代码正确处理 NULL。
  • 在没有任何测试/准备的情况下向表中添加带有默认列的非空值。这是一个数据大小操作,因为表中的每一行都必须更新。由于是单个事务,因此有可能生成大量日志。对于 MAX 类型,甚至SQL Server 2012 中的在线列添加都没有帮助,但同样,使用默认 '' 的 MAX 列不为空也没什么意义。
  • 即使确实需要具有默认值的不可为空的 MAX,为此类操作做准备也需要对所需的日志空间(数据大小的 1.5 到 2.5 倍)和日志文件的预增长进行强制性评估。最有可能的是,这就是现在大部分时间花在增长和归零日志上的事情。
  • 做直播。
  • 在论坛上寻求实时建议...

如果您尝试取消查询,您可能会成功,也可能不会成功,取消可能会很快,也可能需要另外 25 分钟或更长时间,具体取决于当前进度的位置(可能因锁定而阻塞或可能正在进行)。在后一种情况下,求助于绝望并尝试重新启动服务器将导致数据库恢复持续更长时间

  • @GoatBreeder 你对空值有一个非常规的看法。 (4认同)

小智 5

添加新列所需的时间取决于表中的数据量。如果您运行sp_who2 active以查看进程 ID 是什么,您就可以完成kill这项工作。它将进入回滚状态,但会将表恢复到原来的状态。

你不应该在不知道这个过程需要多长时间的情况下尝试改变生产系统的表。