用于添加列的SQL Alter表,它是否可以做任何“可怕”的事情?

时间:2010-06-10 22:08:43

标签: sql tsql

我需要在live sql数据库中的现有表中添加一列。 我知道如何使用ALTER命令,但我想知道的是它对表的影响。

例如,如果使用SQL Management Studio,它声称添加列将“删除并重新创建”表。

ALTER表命令也会这样做吗?

这张表一直被访问并且非常重要,所以我想在此之前确定这一点。

6 个答案:

答案 0 :(得分:7)

不,ALTER TABLE x ADD y不会重新创建表,它只会添加列。您可以遇到的唯一问题是列应该是NOT NULL。在这种情况下,除非您指定默认值(如果该表中已存在行),否则该命令将以错误结束。这是因为它需要知道要填充现有行的内容。

答案 1 :(得分:5)

通过“经常访问”,您的意思是“我没有任何停机时间或维护窗口可以对数据库进行重大更改”?如果是这样,那么 是可怕的部分。就像每个人都说的那样,此更新需要对表进行独占锁定,如果必须等待锁定,那么您可能会遇到阻塞,超时和可能的愤怒用户。

此外,新列可能需要更新表。我不是100%清楚这里发生了什么,但如果(这是一个“假设”的例子,但它可能发生)你将char(100)列添加到刚刚拥有其聚集索引的10,000行表使用fillfactor = 0重建,然后每行向已经填满的页面添加100个字节,该数据在哪里?您可以获得页面拆分或转发记录,这两个记录都需要花费时间来构建SQL - 这意味着需要很长的块以及访问表的请求的进一步延迟。

说真的,试着找到停机时间,或者至少是低容量时间(周日凌晨2点?)来做这样的工作。如果可以的话,测试一下......但很少有地方有测试网站模仿繁忙的生产网站。如果没有别的,那么对你的数据库副本的测试将大致显示需要多长时间,如果你能得到一个停机时间窗口。

答案 2 :(得分:1)

(免责声明:根据一般SQL经验回答,不是特定于MS SQL Server)

首先在不太重要的数据库中试用。

至少,它可能需要一个表锁,它会在更改期间阻止访问。这可能是几毫秒到一分钟或更长,具体取决于表的大小和服务器负载。

ALTER命令仅添加列不应删除任何现有信息。

答案 3 :(得分:0)

如果他做任何“吓人”的事情,这可能只是数据库服务器代码中的错误。

但是你必须知道,数据库被锁定几次取决于数据库长度,而列正在添加。

答案 4 :(得分:0)

查看它生成的脚本。

如果您尝试在GUI中插入一列,则会重写该表。

最后添加一列不会。

答案 5 :(得分:0)

取决于数据库引擎如何布局文件。如果出现以下情况,可以避免“可怕”的行为:

  1. 可以在每行的末尾添加NULL,而无需在行中实际添加字节,或
  2. 每行都有足够的扩展空间。
  3. 例如,在SQLite中,ADD COLUMN始终是O(1)操作。

    MS SQL Server没有property(1),如果property(2)为false,则可能需要页面拆分。