我有一个数据库,其中包含大量当前为NTEXT的字段。

升级到SQL 2005后,我们已经对将它们转换为NVARCHAR(MAX)进行了一些性能测试。

如果您阅读本文:

http://geekswithblogs.net/johnsPerfBlog/archive/2008/04/16/ntext-vs-nvarcharmax-in-sql-2005.aspx

这说明简单的ALTER COLUMN不会将数据重新组织成行。

我在数据中遇到了这种情况。如果仅运行ALTER COLUMN,实际上在某些方面的性能会差很多。但是,如果我为所有这些字段运行UPDATE Table SET Column = Column,那么我们将获得极大的性能提升。

我的问题是数据库由数百个具有数百万条记录的列组成。一个简单的测试(在性能低下的虚拟机上)具有一个包含一个NTEXT列的表,其中包含700万条记录,而更新则花费了5个小时。

关于我如何以更有效的方式来最大程度地减少停机时间和锁定的方式来更新数据,有人可以提供任何建议吗?

编辑:我的备份解决方案是随时间推移以块为单位更新数据,但是,使用我们的数据,这会导致性能下降,直到所有记录都已更新,并且时间越短越好,因此我仍在寻找更快的方法更新方式。

最佳答案

如果您无法安排预定的停机时间...

创建两个新列:
nvarchar(最大)
已处理标志INT默认值0

在已处理的标记上创建非聚集索引

您可以使用UPDATE TOP(您要更新按主键排序的最上层)。

只需在更新过程中将已处理标志设置为1,以便下次更新仅在已处理标志仍为0的情况下更新

您可以在更新后使用@@ rowcount来查看是否可以退出循环。

我建议在每个更新查询之后使用WAITFOR几秒钟,以使其他查询有机会获得表上的锁,而不会使磁盘使用量重载。

10-05 19:24