从表中删除列时会发生什么?

时间:2014-05-19 15:53:48

标签: sql database sql-server-2012

我有一个MS SQL Server数据库。我只是做了一些实验,确定了某些操作需要多长时间,这样我们就可以在更新数据库时最大限度地缩短网站的停机时间。我需要更改列的定义,但表很大,所以这需要两个小时。所以计划B:我创建了一个新列,将旧列中的数据复制到新列,删除了旧列,并将新列重命名为旧列的名称。 (我以为我们可以在网站仍在运行的情况下复制数据,然后将其拖放足够长时间以进行删除和重命名。也许这是一个愚蠢的想法,因为我如何确保记录不会更新而副本正在发生,但这一切都与这个问题无关。)

现在这就是困扰我的部分:

alter table add column: 0秒。好吧,我认为它只是添加了一个元数据条目,引擎足够智能,可以处理尚未填充值的列。

update set newcolumn=oldcolumn 2小时。这就是我的预期。

Delete oldcolumn:0秒。

现在让我感到困惑。如果复制数据需要2个小时,好的删除并不涉及进行类型格式转换,我可以看到它会更快,但我无法想象它可以在不到1秒的时间内处理数百万条记录。所以它必须只是更新元数据。但是,数据必须仍然存在于数百万条占用磁盘空间的记录中,并且在我们读取记录时必须读取等等。删除的列然后永远挂起吗?当记录更新时,他们是否一次清理一条记录?他们是否被一些后勤工作清理干净了?也许我应该做更多的实验:通常需要更长的时间来进行删除,真正去更新所有记录,但出于某种原因,这是一个特例吗?

在我的实验中,该列为nvarchar(max),每条记录通常为1000个字符左右。由于其他列总共大约150个字节,因此该列是表的大部分内容,因此它不是一个没有实际意义的问题。

1 个答案:

答案 0 :(得分:0)

更新花费时间,因为它必须复制数据。

删除列只是调整一些元数据,但保持实际数据不变。它所在的空间只是标记为空闲,可以随时覆盖存储空间。 在那之前它甚至可以恢复掉落列。