Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 使用匿名数据更新大型(280M行)表_Sql Server_Tsql_Sql Server 2008 R2 - Fatal编程技术网

Sql server 使用匿名数据更新大型(280M行)表

Sql server 使用匿名数据更新大型(280M行)表,sql-server,tsql,sql-server-2008-r2,Sql Server,Tsql,Sql Server 2008 R2,我们有一个正在迁移到新环境的生产数据库,客户要求在项目处于开发阶段时对某些列和某些表中的数据进行匿名化 供应商提供了替换数据的脚本-例如: UPDATE ThisTable SET Description = 'Anonymised ' + TableKey 现在的问题是,有几个表有数百万行。最大的是2840万行 当然,由于锁、TempDb和行版本、日志文件等原因,上述语句永远不会适用于这样的表 我有一个我以前使用过的脚本,它基本上执行以下操作: 我如何操作的当前版本: 1.创建源表主键的临时

我们有一个正在迁移到新环境的生产数据库,客户要求在项目处于开发阶段时对某些列和某些表中的数据进行匿名化

供应商提供了替换数据的脚本-例如:

UPDATE ThisTable SET Description = 'Anonymised ' + TableKey
现在的问题是,有几个表有数百万行。最大的是2840万行

当然,由于锁、TempDb和行版本、日志文件等原因,上述语句永远不会适用于这样的表

我有一个我以前使用过的脚本,它基本上执行以下操作:

我如何操作的当前版本:
1.创建源表主键的临时表(并在主键上创建索引)。
2.从临时表中选择top n PK,并处理源表中的相应行。
3.从临时表中删除前n个PK
4.重复步骤2

这工作得很好-它提供了合理的性能(并且做了一些度量来预测结束时间)。但是,在大表上运行它可以预测4天的运行时间

我采取的其他措施是将数据库置于简单恢复模式

我们拥有对服务器的独占访问权,可以“随心所欲”

核心问题是我们谈论的是大量的行。一种想法是BCP输出到文本文件,脱机处理,然后BCP输入。然而,我们仍然在处理一个包含284000000行的文本文件

询问:

那么,关于如何实现上述目标还有其他想法吗?我是否缺少一种“简单”的方法来实现这一点?

步骤1用名称ie tablename+temp包装相同的表格结构

步骤2:现在从“从表名选择”中插入到表名+临时表中

ie插入tablenametemp 从tablename中选择colunns“匿名”+TableKey作为描述

步骤3将tablename重命名为tablename1,将tablename+temp重命名为tablename

步骤4删除tablename1(验证后)


请注意,如果您已经创建了约束,请也重命名它们。

您可以提供一些示例,说明如何匿名数据吗?分批运行……如果您尝试一次更新所有数据,实际会发生什么情况?我不明白为什么把它分开会更快。我曾经使用基于主键的row_number,然后使用row_number%10000=0为每一万条记录写出一个键,然后我可以通过文件一次删除10000个键。使用上面的简单sql一次性更新会导致TempDb在试图保存所有RowVersions时占用磁盘空间。也许增加TempDb大小和相关的磁盘空间会起作用。请记住,在查询运行约4.5小时后更新失败。我所能想到的是尝试在进程之间拆分批,例如在临时表中将范围标记为a、b、c、d等,然后进行一些并发处理,也就是说,您可能已经认为它会遇到瓶颈,而且,乐观的想法是,拥有10个流程会快10倍——到您编写和调查优化的时候——它可能已经完成了所有的工作,并且在上面完成了更多的工作,而更新本身就可以完成。这可能会避免记录锁定,但我认为DB是他想做的事情——所以我不理解他的记录锁定问题——我同意@AndrewDeighton的观点——这是我们在源表上已经可以做的事情。我没有为其他用户锁定表的问题-我们拥有对数据库的独占访问权。关于“锁问题”——我可能在这一点上是不正确的(回想过去)。但是,我们会遇到一个问题,即使用行版本填充TempDb的过于简单的更新。