Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server,将NTEXT转换为NVARCHAR(最大值)_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

SQL Server,将NTEXT转换为NVARCHAR(最大值)

SQL Server,将NTEXT转换为NVARCHAR(最大值),sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我有一个数据库,其中包含大量当前为NTEXT的字段 升级到SQL2005之后,我们已经运行了一些性能测试,将它们转换为NVARCHAR(MAX) 如果您阅读本文: 这说明简单的ALTER列不会将数据重新组织成行 我用我的数据体验到了这一点。如果我们只运行ALTER列,实际上在某些方面的性能要差得多。然而,如果我为所有这些字段运行一个更新表SET Column=Column,那么我们将获得极大的性能提升 我遇到的问题是,数据库由数百个这样的列和数百万条记录组成。一个简单的测试(在一个低性能虚拟机

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

升级到SQL2005之后,我们已经运行了一些性能测试,将它们转换为NVARCHAR(MAX)

如果您阅读本文:

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

我用我的数据体验到了这一点。如果我们只运行ALTER列,实际上在某些方面的性能要差得多。然而,如果我为所有这些字段运行一个更新表SET Column=Column,那么我们将获得极大的性能提升

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

有谁能提供一些建议,告诉我如何以更有效的方式更新数据,从而最大限度地减少停机时间和锁定


编辑:我的备份解决方案是随着时间的推移以块的形式更新数据,但是,在更新所有记录之前,使用我们的数据会导致性能下降,而且时间越短越好,因此我仍在寻找一种更快的更新方法。

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


您将使用一个while循环,该循环递增一个计数器,对应于更新查询的每个迭代中要更新的行的ID。这可能不会加快更新所有700万条记录所需的时间,但会大大降低用户因记录锁定而遇到错误的可能性。

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

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

创建两个新列: nvarchar(最大值) processedflag INT默认值为0

在processedflag上创建非聚集索引

您有可用的UPDATE TOP(您希望按主键顺序更新TOP)

只需在更新期间将processedflag设置为1,以便下一次更新仅在processed flag仍然为0的情况下进行更新

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


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

如果您可以获得计划的停机时间:

  • 备份数据库
  • 将恢复模式更改为简单
  • 从要更新的表中删除所有索引
  • 添加具有非聚集索引的列maintenanceflag(INT默认值0)
  • 运行: 更新前1000名 数据表名 从ntext设置nvarchar, maintenanceflag=1 其中maintenanceflag=0
  • 根据需要多次(在具有延迟的循环内)

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


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

    最小化。您也可以考虑测试,以查看SSIS包是否可以更有效地执行此操作。


    无论你做什么,都要让它成为一个自动化的过程,可以在非工作时间安排和运行。你尝试访问数据的用户越少,一切都会进行得越快。如果可能的话,选择三个或四个最关键的更改,并将数据库关闭以进行维护(在正常关闭时间内),并在单用户模式下执行。一旦你得到了最关键的,其他的可以安排一个晚上一到两个。

    是的,这是我目前的计划,需要很多组织才能让它全部工作,但应该是可以实现的。我还将一次只更新一个字段,以便在准备更新该列之前不会降低性能。我只是希望有一些神奇的解决方案,我不知道。当你谈论这些类型的记录时,以这种方式分批运行通常会提高更新所需的时间。