4

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

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

表 A 有 210 万条记录。

我需要迭代每一行并且:

步骤 1. 使用复杂子查询的结果更新特定字段,执行一些文本操作


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

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

我可以用游标来写这一切——非常简单,但我知道作为一般规则使用游标是不被接受的。

我使用新的 MERGE 函数为上面的第 1 步编写了一个纯 sql 脚本。它使用的子查询调用视图,而视图又使用缩放函数来执行一些复杂的文本操作。在此通过 SSIS 运行 1h 12m 之后,由于 tembDB.log 磁盘空间不足,SSIS 被炸毁。

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

那么,有没有人对 SSIS 中实现上述第 1 步和第 2 步的最佳工具有任何提示?

4

2 回答 2

1

我想知道是什么限制了您使用 SSIS 而不是原始 SQL。这是一次性的工作,而不是常规的数据馈送?如果它是一次性的,我很想将源数据拉到目标数据库中的临时表(或同一服务器上的单独临时数据库)中,并在那里做复杂的事情。SSIS 非常适合重复的、定期的数据馈送;如果这不是必需的,那么我会使用 SQL。

(TBH我还没有探索过SSIS的一些更高级的特性,行级操作)。

您可以将第 2 步拆分为两个 SQL 语句,在不同的集合上运行:

一个。电子邮件确实存在的行集;

湾。不存在电子邮件的行集

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

于 2012-11-29T16:14:18.953 回答
0

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

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

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

于 2012-12-01T23:42:32.160 回答