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


9

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

alter table Table1 ALTER COLUMN Column1 XML NULL

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

  1. 为什么应用更改需要这么长时间?
  2. 有更好的方法吗?

Answers:


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


6

会更快:

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

这样做的好处是您在操作期间不会在原始表上保持锁定。该表应仅在重命名阶段被锁定。(它假定SQL Server支持对象级重命名。)


是的,SQL Server支持使用系统存储过程进行对象级别的重命名sp_rename
贡萨鲁2011年

我能够通过这种方式在1分钟内用350万行更改列。
Mohsen Afshin

2

将列从NOT NULL更改为NULL时,需要触摸每一行,这就是为什么要花这么长时间才能完成的原因。没有任何方法可以使它花费更少的时间。


1

另一个选择是使用有关表的正确定义来创建新列,使用旧列中的数据更新该列,然后删除旧列。

或者,您可以在INT列上引用SE的较旧帖子,该帖子处理类似问题。

/programming/4311559/sql-server-performance-for-alter-table-alter-column-change-data-type


就我而言,我的列只是充满了NULL,所以我认为这是应该走的路,用正确的名称创建一个新的完全NULL列应该根本不需要时间...然后删除旧列,而不是处理数百万个刀片...
Zack

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.