【问题标题】:optimizing a lookup task in ssis优化 ssis 中的查找任务
【发布时间】:2015-04-06 13:02:16
【问题描述】:

我对这种查询有疑问。我正在将 ETL 从 Access 迁移到 SSIS。一个查询涉及与 Oracle 数据库中的表的内部联接:

SELECT 
SQL_TABLE.COLUMN1,
SQL_TABLE.COLUMN2,
ORACLE_TABLE.COLUMN5,
ORACLE_TABLE.COLUMN6
FROM 
SQL_TABLE INNER JOIN ORACLE_TABLE ON
SQL_TABLE.ID_PPAL = ORACLE_TABLE.IDENTIF
WHERE
(((ORACLE_TABLE.COLUMN6) Is Not Null));

问题是,Oracle 表有超过 1800 万个寄存器,而 sql 表有不到 300 条记录。结果,Inner Join 应该给出 2500 条记录。

首先我尝试使用如图所示的合并连接任务,但是由于表的特性,这根本没有效率,但是寻找可能的情况有人建议我使用查找任务,但是这只会给我找到的每场比赛一个记录,这对我没有用,我不能丢失任何记录。

我想知道是否有其他方法可以执行此查询,因为我无法相信在这方面访问会比 SSIS 更有效。

【问题讨论】:

  • 您是否仅使用内部连接将它们完美连接并检查是否有任何重复行
  • 为什么你说你不能丢失任何行?如果您以前使用 INNER 连接执行此操作,则只会返回匹配的行,并且所有不匹配的行都会丢失。如果您正确实施,应该可以通过查找来做到这一点。
  • Oracle 中的 identif 列不是 PK,Oracle 中的 PK 是组合的,所以,只有这个值的内连接可以给我几个结果,但查找只给我第一个匹配。
  • 好吧,我误解了想要的结果。在这种情况下,不,您不能使用 Lookup 来做您想做的事。 @Benjamin 的回答是最好的解决方案。

标签: sql-server oracle ssis lookup


【解决方案1】:

根据我的经验,SQL Server 不会优化涉及 Oracle 的查询。我发现最快的方法是 1) 使用 Oracle 驱动程序从 SSIS 访问数据。 2) 使用快速加载(使用表锁)将 Oracle 表(如果合适,使用 where 条件)加载到 SQL Server 工作表中。 3) 为表创建聚集索引。 4) 加入。如果您要重用包,您需要截断工作表并删除索引作为包的前两个步骤。

【讨论】:

    【解决方案2】:

    您应该检查任何过滤器或尝试在 Oracle 数据库中进行连接,从而导致少量泄漏。如果结果不正确,请尝试使用变量存储数据并创建脚本。

    这可以为您服务:

    http://www.bidn.com/blogs/ShawnHarrison/ssis/4579/looping-through-variable-values-with-a-foreach-loop-container

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多