SQL Server,将NTEXT转换为NVARCHAR(MAX)

SQL Server,将NTEXT转换为NVARCHAR(MAX)

问题描述:

我有一个数据库,其中包含大量当前为NTEXT的字段。SQL Server,将NTEXT转换为NVARCHAR(MAX)

升级到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,那么我们将获得极大的性能提升。

我遇到的问题是数据库由成百上千个记录的这些列组成。一个简单的测试(在低性能虚拟机上)有一张表,其中包含一个包含700万条记录的单个NTEXT列,需要5个小时才能更新。

任何人都可以提供任何建议,如何以更有效的方式更新数据,最大限度地减少停机时间和锁?

编辑:我的备份解决方案是更新块中的数据随着时间的推移,但是,与我们的数据,这导致更糟糕的表现,直到所有的记录已更新,这个时间越短越好,所以我仍然寻找更快的方式来更新。

如果你无法获得计划停机时间....

创建两个新的栏目: 为nvarchar(最大) processedflag INT DEFAULT 0

在processedflag创建一个非聚集索引

您有可用的UPDATE TOP(您想更新由主键排序的顶部)。

在更新过程中只需设置processedflag为1,以便下一次更新将只更新的处理标志仍是0

您可以使用@@ ROWCOUNT更新后,看看你是否可以退出循环。

我建议在每次更新查询后使用WAITFOR几秒钟以使其他查询有机会获取表上的锁定并且不会超载磁盘使用率。

如何批量运行更新 - 一次更新1000行。

您将使用一个while循环来增加一个计数器,对应于更新查询的每次迭代中要更新的行的ID。这可能不会加快更新所有700万条记录所花费的时间,但它会使得用户由于记录锁定而出现错误的可能性小得多。

+0

是的,这是我目前的计划,需要很多组织才能完成所有工作,但应该可以实现。我也一次只更新一个字段,所以在我准备更新该列之前,我的性能不会下降。我只是希望有一些神奇的解决方案,我不知道。 – 2009-01-28 11:51:53

在低性能虚拟机上运行数据库测试并不真正指示生产性能,涉及的繁重IO将需要快速磁盘阵列,虚拟化将对其进行限制。

如果你能获得计划停机时间:

  1. 备份数据库
  2. 更改恢复模式,以简单
  3. 从你正在更新
  4. 添加列maintenanceflag表(INT删除所有索引DEFAULT 0)与非聚集索引
  5. 运行: UPDATE TOP 1000 表名 SET nvarchar from ntext , maintenanceflag = 1 WHERE maintenanceflag = 0

多个所需次数(一个循环中有延迟)。

完成后,执行另一次备份,然后将恢复模型更改回原来的状态并添加旧索引。

请记住,该表上的每个索引或触发器都会导致额外的磁盘I/O,并且简单恢复模式会最小化日志文件I/O。

您可能还会考虑测试以查看SSIS包是否可以更有效地完成此操作。

无论您做什么,都可以将其设置为可以在非工作时间安排和运行的自动化流程。您尝试访问数据的feweer用户越快,一切就会越快。如果可能的话,挑出三到四个最关键的变化,并将数据库记录下来(在正常关闭的时间内),并以单用户模式进行。一旦你得到最重要的,其他人可以安排一个或两个晚上。