我有一个包含大量字段的数据库,目前是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表SET Column = Column,那么我们将获得极大的性能提升.
我遇到的问题是数据库包含数百个具有数百万条记录的列.一个简单的测试(在低性能虚拟机上)有一个包含单个NTEXT列的表,包含700万条记录需要5个小时才能更新.
任何人都可以提供任何关于如何以更有效的方式更新数据以最大限度地减少停机时间和锁定的建议吗?
编辑:我的备份解决方案只是随着时间的推移更新块中的数据,但是,使用我们的数据会导致性能下降,直到所有记录都更新为止,此时间越短越好,所以我仍然在寻找更快的速度更新的方式.
如果你无法获得预定的停机时间....
创建两个新列:nvarchar(max)processedflag INT DEFAULT 0
在processedflag上创建非聚集索引
您可以使用UPDATE TOP(您希望更新按主键排序的顶部).
只需在更新期间将processedflag设置为1,以便下次更新仅更新处理标志仍为0的位置
您可以在更新后使用@@ rowcount来查看是否可以退出循环.
我建议在每次更新查询后使用WAITFOR几秒钟,以使其他查询有机会获取表上的锁,而不是使磁盘使用量过载.