1

我想将旧数据库中的数据转换为具有新结构的新数据库。在旧数据库中,我有必须转换为新数据库中的附件表的附件表。

旧数据库附件表结构如下:

Attachment (ID int, Image Image, ...)

新的数据库附件表结构如下:

Attachment (ID int, Image Image, OldID Int, ...)

每次我执行转换包副本时,仅不存在从旧数据库到新数据库的数据(新数据)。

我使用以下格式进行操作:

在此处输入图像描述

在旧表和新表 ( ID --> OldID) 之间查找以检查是否存在记录。

当我运行 SSIS 包时;SSIS,首先将所有查找和源组件数据缓存在内存中,然后执行打包。我在这个包中的源数据非常庞大,当我运行这个包时,它的运行速度会非常慢。我想从旧数据库中获取lookup for check exists组件后每个新记录的图像列数据。如果我使用新的查找组件从旧数据库中获取图像列数据,SSIS 缓存这个新的查找数据并且运行这个包的执行时间不会改变。我必须做什么?

提前致谢。

4

3 回答 3

0
  1. 仅从ID源表中 选择
  2. 在目标数据库中进行查找而不做任何更改
  3. 对于no match output在源表中进行查找,Cache Mode设置为No cache,这会将 Image 附加到流中。

在这种情况下,将单独获取每个图像,这可能会影响性能。

于 2012-09-22T15:47:34.150 回答
0

您也可以在两个数据流中执行此操作。

在第一:

  1. 从源表中仅选择 ID
  2. 在目标数据库中进行查找而不做任何更改
  3. Ids使用 Srcipt 组件作为目标女巫代码,将字符串变量中的新内容存储IdListToBeFetched为逗号分隔列表,类似于:

using System.Text;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    StringBuilder sb;
    public override void PreExecute()
    {
        base.PreExecute();
        sb = new StringBuilder();
    }

    public override void PostExecute()
    {
        base.PostExecute();
        Variables.IdListToBeFetched = sb.ToString().TrimEnd(',');
    }

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        if (!Row.ID_IsNull)
        {
            sb.AppendFormat("{0},", Row.ID);
        }
    }
}

在第二个数据流中,将源的 sql 命令设置为从类似于"select ID, Image from Attachment where ID in (" + @[User::IdListToBeFetched] + ")"和 set DelayValidation=的表达式动态生成的查询True。它将把所有图像都放在一个select应该更快的位置。

将动态生成的查询设置为SqlCommandADO NET Source或这样的源ODBC Source

  1. 选择包含您的来源 Expression的属性Data Flow Task
  2. 在此处查找属性[your source name].[SqlCommand]并设置表达式

将动态生成的查询设置为 sql 命令OLE DB Source(取自Jamie Thomson 博客):

  1. 创建一个名为 SourceSQL 的新变量
  2. 打开 SourceSQL 变量的属性窗格(按 F4)
  3. 设置 EvaluateAsExpression=TRUE
  4. 设置Expression"select ID, Image from Attachment where ID in (" + @[User::IdListToBeFetched] + ")"
  5. 对于您的 OLE DB 源组件,打开编辑器
  6. 设置数据访问模式="来自变量的 SQL 命令"
  7. 设置变量名 = "SourceSQL"
于 2012-09-22T16:34:05.003 回答
0

你确定你的想法正确吗?即使您加载的数据量很大,SSIS 也不应该很慢。

您的 LOOKUP 组件需要确保它没有做任何它不需要做的事情。如果您将其指向新数据库中的表,请立即将其更改为 SQL 查询。在此查询中,您只需要将SELECT OldId FROM tbl来自旧数据库的传入 ID 指向此。您的数据流应该包含来自旧数据库的 ID 和图像,该数据库在您的 OLE DB 目标中被映射ID -> OldId和“图像 -> 图像”。不再需要像您在此处执行的“仅插入新行”操作。

对于这项工作,不需要任何自定义代码或动态 SQL。您-确实-希望从数据流中的源系统获取 ID 和图像(除非您有主要的网络瓶颈需要解决)- 进行 RBAR 查找以从旧系统获取图像数据是一种非常落后的方式考虑你的 ETL。

于 2012-09-23T16:09:59.540 回答