我需要将包含数百万行的表中的列从NOT NULL更改为NULL。我尝试了一个简单的
alter table Table1 ALTER COLUMN Column1 XML NULL
但这需要永远。所以这是我的问题:
- 为什么应用更改需要这么长时间?
- 有更好的方法吗?
我需要将包含数百万行的表中的列从NOT NULL更改为NULL。我尝试了一个简单的
alter table Table1 ALTER COLUMN Column1 XML NULL
但这需要永远。所以这是我的问题:
Answers:
1)人们可能需要有关表+非聚集索引的完整结构的更多信息,以正确了解正在发生的事情,但我怀疑与NULL位图有关。
请参阅以获取有关该主题的更多详细信息。 http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-null-bitmap-size.aspx
2)是,只要您有存储空间,请创建一个具有正确的可空性的新表,并分批传输数据以避免过多的日志增长,并使用下面列出的技术切换该表。我已经完成了几次,几乎没有停机时间。
http://jahaines.blogspot.com/2009/12/sql-server-2005-how-to-move-10-millions.html
会更快:
Column1
INSERT INTO <NewTable> SELECT * FROM <OriginalTable>
;这样做的好处是您在操作期间不会在原始表上保持锁定。该表应仅在重命名阶段被锁定。(它假定SQL Server支持对象级重命名。)
另一个选择是使用有关表的正确定义来创建新列,使用旧列中的数据更新该列,然后删除旧列。
或者,您可以在INT列上引用SE的较旧帖子,该帖子处理类似问题。
/programming/4311559/sql-server-performance-for-alter-table-alter-column-change-data-type
如果在命令运行时打开SQL活动监视器,您将能够知道它实际上是否正在处理它,或者它是否正在等待表的某种形式的排他锁。
sp_rename
。