Sql 循环200万条记录并根据每行中的特定条件生成一组更新或插入的最佳性能

Sql 循环200万条记录并根据每行中的特定条件生成一组更新或插入的最佳性能,sql,database,ssis,database-migration,Sql,Database,Ssis,Database Migration,我目前正在使用SSIS 2012进行大型数据迁移练习 我有一项任务要完成,但不确定最佳方法 表A有210万条记录 我需要迭代每一行,并: 第一步。使用执行某些文本操作的复杂子查询的结果更新特定字段 第二步。从表格A行的电子邮件字段中获取电子邮件地址 2a。查找用户表 2b。如果存在电子邮件,则获取ID并更新表格A行中的用户ID 2c。若电子邮件不存在-将新记录插入用户表,取回ID并更新表A行中的用户ID 第1步和第2步不必同时完成,这些任务可以分割成单独的数据流,因为它们是不相关的 我可以用光标

我目前正在使用SSIS 2012进行大型数据迁移练习

我有一项任务要完成,但不确定最佳方法

表A有210万条记录

我需要迭代每一行,并:

第一步。使用执行某些文本操作的复杂子查询的结果更新特定字段

第二步。从表格A行的电子邮件字段中获取电子邮件地址
2a。查找用户表
2b。如果存在电子邮件,则获取ID并更新表格A行中的用户ID
2c。若电子邮件不存在-将新记录插入用户表,取回ID并更新表A行中的用户ID

第1步和第2步不必同时完成,这些任务可以分割成单独的数据流,因为它们是不相关的

我可以用光标来写这一切——非常简单,但我知道一般不赞成使用光标

我使用新的合并函数为上面的步骤1编写了一个纯sql脚本。它使用的子查询调用一个视图,该视图又使用一个scaler函数来执行一些复杂的文本操作。在这之后,通过SSIS运行了1个小时,由于tembDB.log磁盘空间不足,SSIS爆炸

不确定我的查询是否是导致tembDB失控的原因,或者是先前运行的SSIS包中的其他原因?我怎么知道


那么,有人知道SSIS中实现上述步骤1和步骤2的最佳工具的一些技巧吗?

我想知道是什么限制了您使用SSIS而不是原始SQL。这是一次性工作,而不是常规数据馈送吗?如果是一次性的,我会尝试将源数据拉入目标数据库中的一个暂存表(或同一服务器上的一个单独的暂存数据库),并在那里执行复杂的操作。SSIS非常适合于重复、定期的数据馈送;如果这不是必需的,那么我会使用SQL

(TBH我还没有探讨SSIS的一些更高级的功能,行级操作)

您可以将步骤2拆分为两个SQL语句,在单独的集合上操作:

a.存在电子邮件的一组行

b.不存在电子邮件的行集


在开始之前对行进行“分类”,而不是对每一行进行分类;仔细检查一下你的两套衣服是否覆盖了整张桌子。如果您喜欢SSI,您可以在SSI中的单独数据流中执行此操作(只要源数据库允许您对其运行SQL,而不仅仅是转储整个表)。

对于步骤1,“复杂子查询”的SSI等价物通常是带有查找的数据流。SSIS的“文本操作”/“标量函数”等价物通常是带有脚本转换的数据流。无论您可以在T-SQL中编写什么操作,都可以在.NET中完成,您可以利用.NET库,例如Regex、HTMLEncode等,它可能会更优雅,运行更快

对于第2步,我将使用OLEDB源启动一个新的数据流,该源为您提供来自TableA的不同电子邮件值。然后添加一个查找转换以对照“用户表”进行检查。忽略匹配项并将不匹配的行发送到OLE DB目标以将它们插入“用户表”


然后添加另一个数据流,该数据流获取所有TableA行,查找“用户表”值并将批次插入临时表。如果您必须将所有内容返回到TableA中,您可以在此时截断并重新加载它—比更新或游标快得多。

我认为您需要显示数据以及您尝试运行的更新(查询)步骤。执行大型合并语句时要做的一件重要事情是检查您正在修改的列上是否有索引。如果是这样的话,更新/插入将会很慢。在列上删除索引,运行MERGE,然后重新创建索引。