在具有数百万行的表中更改列定义的最有效方法是什么

Jon*_*ski 9 sql-server-2008 database-design

我需要在包含数百万行的表中将一列从 NOT NULL 更改为 NULL。我试过一个简单的

alter table Table1 ALTER COLUMN Column1 XML NULL
Run Code Online (Sandbox Code Playgroud)

但它需要永远。所以这里是我的问题:

  1. 为什么应用更改需要这么长时间?
  2. 有没有更好的方法来做到这一点?

Rob*_*ler 6

是否会更快:

  1. 创建一个具有正确定义的新表 Column1
  2. INSERT INTO <NewTable> SELECT * FROM <OriginalTable>;
  3. 将 OriginalTable 重命名为 OriginalTable_old;将 NewTable 重命名为 OriginalTable
  4. 验证并删除 OriginalTable_old

这里的优点是您在操作期间不会对原始表持有锁。该表应该只在重命名阶段被锁定。(它假定 SQL Server 支持对象级重命名。)


San*_*ddy 3

1)人们需要有关表+非聚集索引的完整结构的更多信息,才能正确地弄清楚发生了什么,但我怀疑与 NULL 位图有关。

请参阅有关该主题的更多详细信息。 http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-null-bitmap-size.aspx

http://www.sqlskills.com/BLOGS/PAUL/post/A-SQL-Server-DBA-myth-a-day-(630)-three-null-bitmap-myths.aspx

2) 是的,只要您有存储空间,创建一个具有正确可空性的新表,并分批传输数据以避免日志过度增长,并使用下面列出的技术切换表。我已经这样做过好几次了,几乎没有停机时间。

http://jahaines.blogspot.com/2009/12/sql-server-2005-how-to-move-10-millions.html